[解決済み] マルチパート識別子をバインドできなかった
質問
SOで同じようなエラーを見ましたが、私の問題に対する解決策が見つかりません。 私は次のようなSQLクエリを持っています。
SELECT DISTINCT
a.maxa ,
b.mahuyen ,
a.tenxa ,
b.tenhuyen ,
ISNULL(dkcd.tong, 0) AS tongdkcd
FROM phuongxa a ,
quanhuyen b
LEFT OUTER JOIN ( SELECT maxa ,
COUNT(*) AS tong
FROM khaosat
WHERE CONVERT(DATETIME, ngaylap, 103) BETWEEN 'Sep 1 2011'
AND
'Sep 5 2011'
GROUP BY maxa
) AS dkcd ON dkcd.maxa = a.maxa
WHERE a.maxa <> '99'
AND LEFT(a.maxa, 2) = b.mahuyen
ORDER BY maxa;
このクエリを実行すると、エラー結果になります。
マルチパート識別子 "a.maxa" をバインドできませんでした。
なぜですか?
P/s: クエリを2つの個別のクエリに分割すると、それはうまく実行されます。
SELECT DISTINCT
a.maxa ,
b.mahuyen ,
a.tenxa ,
b.tenhuyen
FROM phuongxa a ,
quanhuyen b
WHERE a.maxa <> '99'
AND LEFT(a.maxa, 2) = b.mahuyen
ORDER BY maxa;
そして
SELECT maxa ,
COUNT(*) AS tong
FROM khaosat
WHERE CONVERT(DATETIME, ngaylap, 103) BETWEEN 'Sep 1 2011'
AND 'Sep 5 2011'
GROUP BY maxa;
解決方法は?
暗黙的な結合と明示的な結合を混在させています。それは許されることですが、それを適切に行う方法を知っておく必要があります。
つまり、明示的な結合(これは、(1)と(2)を使って実装されるものです。
JOIN
キーワード) は、暗黙的なもの (コンマ結合、結合条件が
WHERE
節を含む)。
クエリの概要はこんな感じです。
SELECT
…
FROM a, b LEFT JOIN dkcd ON …
WHERE …
おそらく、このような挙動を期待しているのでしょう。
SELECT
…
FROM (a, b) LEFT JOIN dkcd ON …
WHERE …
つまり、テーブルの組み合わせ
a
と
b
がテーブルと結合している
dkcd
. 実際には、次のようなことが起こっています。
SELECT
…
FROM a, (b LEFT JOIN dkcd ON …)
WHERE …
というのは、もうお分かりかもしれませんが
dkcd
に対して特別に結合されています。
b
のみであり
b
というように、結合の結果を
a
でさらにフィルタリングし
WHERE
節があります。この場合、すべての参照先が
a
の中で
ON
節は無効です。
a
はその時点では不明です。そのため、エラーメッセージが表示されるのです。
もし私があなただったら、このクエリを書き換えてみると思いますが、一つの可能性があるかもしれません。
SELECT DISTINCT
a.maxa,
b.mahuyen,
a.tenxa,
b.tenhuyen,
ISNULL(dkcd.tong, 0) AS tongdkcd
FROM phuongxa a
INNER JOIN quanhuyen b ON LEFT(a.maxa, 2) = b.mahuyen
LEFT OUTER JOIN (
SELECT
maxa,
COUNT(*) AS tong
FROM khaosat
WHERE CONVERT(datetime, ngaylap, 103) BETWEEN 'Sep 1 2011' AND 'Sep 5 2011'
GROUP BY maxa
) AS dkcd ON dkcd.maxa = a.maxa
WHERE a.maxa <> '99'
ORDER BY a.maxa
ここでは、テーブル
a
と
b
がまず結合され、その結果が
dkcd
. 基本的に、これはあなたと同じクエリですが、結合の1つに異なる構文を使用しており、これが大きな違いを生んでいます。
a.maxa
の中の
dkcd
の結合条件が絶対的に有効になりました。
Aaron Bertrand が正しく指摘しているように、おそらくは
maxa
には、特定のエイリアス、おそらく
a
の中にある
ORDER BY
節を使用します。
関連
-
[解決済み] varchar データ型から datetime データ型に変換すると、SQL クエリで範囲外の値が発生する
-
[解決済み】データベースへの「ネイティブ」SQL接続を使用するとはどういう意味ですか?
-
[解決済み] テスト
-
[解決済み】SQL ServerでIdentityカラムを更新する方法は?
-
[解決済み] ORA-12801: 並列クエリサーバー P004 および ORA-01555 でシグナルされたエラー: スナップショットが古すぎる。
-
[解決済み] エラー (ORA-00923: 期待された場所に FROM キーワードが見つかりませんでした)
-
[解決済み] ORA-01779: キーが保存されていないテーブルにマップされる列を変更できません。
-
[解決済み] "このSqlTransactionは完了しました。もう使用できません。"...設定エラー?
-
[解決済み] INSERT INTO ...」の部分を繰り返さずに複数行の挿入を行うには?
-
[解決済み] マルチパート識別子」とは何ですか、なぜバインドできないのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】オペランド型の衝突:intはdateと互換性がない + INSERT文はFOREIGN KEY制約と衝突した
-
[解決済み】使用されるSELECT文は列の数が異なる(REDUX!)
-
[解決済み] アンピボットの主キーを含む対象コードページで、テキストが切り捨てられたか、1つ以上の文字が一致しない。
-
[解決済み] ORA-01790: 式は、対応する式と同じデータ型でなければならないエラーが発生するケース
-
[解決済み] ORA-12801: 並列クエリサーバー P004 および ORA-01555 でシグナルされたエラー: スナップショットが古すぎる。
-
[解決済み] ora-06553 pls-306 'ogc_x' の呼び出しで引数の数または種類が誤っている。
-
[解決済み] Oracle(LiveSQL)のSQL [重複]について
-
[解決済み] ORA-00918: 列があいまいに定義されています」を解決する方法
-
[解決済み] 検索エラー ORA-00932: 不整合なデータ型: 期待された DATE は NUMBER になりました。
-
[解決済み] 時間を時間単位や10分単位でグループ化する方法