私は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;
暗黙的結合と明示的結合が混在しています。それは許可されていますが、それを正しく行う方法を知っておく必要があります。
つまり、明示的結合(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
は不明です。あなたがエラーメッセージを受け取っているのはそのためです。
私があなたであれば、私はおそらくこのクエリを書き直すことを試みるでしょう、そして1つの可能な解決策はかもしれません:
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つに異なる構文を使用するだけで、大きな違いがあります:dkcd
の結合条件における参照a.maxa
は絶対に有効です。
@Aaron Bertrandが正しく指摘しているように、あなたはおそらくmaxa
をORDER BY
節で特定のエイリアス、おそらくa
で修飾するべきです。
クエリでスキーマ(dbo)を間違った方法で使用したときに、このエラーが発生することがあります。
たとえば、次のように書きます。
select dbo.prd.name
from dbo.product prd
エラーになります。
このような場合は、次のように変更してください。
select prd.name
from dbo.product prd
あなたがエイリアス名を与えた場合、それを実際の名前に変更してください
例えば
SELECT
A.name,A.date
FROM [LoginInfo].[dbo].[TableA] as A
join
[LoginInfo].[dbo].[TableA] as B
on [LoginInfo].[dbo].[TableA].name=[LoginInfo].[dbo].[TableB].name;
それをに変える
SELECT
A.name,A.date
FROM [LoginInfo].[dbo].[TableA] as A
join
[LoginInfo].[dbo].[TableA] as B
on A.name=B.name;
複数の結合があるため、結合の順序を変更して解決したため、SQL SERVERで同じエラーメッセージに悩んでいました。
私の場合、問題は私がテーブルに付けたエイリアス名であることがわかりました。 "oa"はSQL Serverには受け入れられないようです。
私にとって効果的だったのは、WHERE句をSELECTサブクエリに変更することでした。
から:
DELETE FROM CommentTag WHERE [dbo].CommentTag.NoteId = [dbo].FetchedTagTransferData.IssueId
に:
DELETE FROM CommentTag WHERE [dbo].CommentTag.NoteId = (SELECT NoteId FROM FetchedTagTransferData)
私はJDBCから同じエラーを抱えていました。すべてを確認し、私の質問は大丈夫だった。結局、where節に引数があります。
where s.some_column = ?
そして私が渡していた引数の値はnullでした。あなたがインターネットを検索するとき、あなたは何かがクエリ構造で間違っているということになるので、これはまた誤解を招く同じエラーを与えますが、それは私の場合ではありません。誰かが同じ問題に直面するかもしれないと思った
このエラーがUPDATE
で発生した場合は、エラーの原因となっている列/フィールドを含むテーブルのJOIN
を再確認してください。
私の場合、これはJOIN
自体が欠如しているためで、未知のフィールドが原因で同じエラーが発生しました( Andriyが指摘したように )。
いくつかのテーブルへの参加を忘れましたか。そうでない場合は、おそらくいくつかのエイリアスを使用する必要があります。
SELECT DISTINCT
phuongxa.maxa ,
quanhuyen.mahuyen ,
phuongxa.tenxa ,
quanhuyen.tenhuyen ,
ISNULL(dkcd.tong, 0) AS tongdkcd
FROM phuongxa ,
quanhuyen
LEFT OUTER JOIN ( SELECT khaosat.maxa ,
COUNT(*) AS tong
FROM khaosat
WHERE CONVERT(DATETIME, ngaylap, 103) BETWEEN 'Sep 1 2011'
AND
'Sep 5 2011'
GROUP BY khaosat.maxa
) AS dkcd ON dkcd.maxa = maxa
WHERE phuongxa.maxa <> '99'
AND LEFT(phuongxa.maxa, 2) = quanhuyen.mahuyen
ORDER BY maxa;
私はSQLに慣れていませんが、私がとっていたコースでこの問題に遭遇し、プロジェクトにクエリを割り当てることがマルチパートエラーを排除するのに特に役立つことがわかった。たとえば、私が作成したプロジェクトはCTU SQL Projectなので、次のように最初の行としてUSE [CTU SQL Project]を使用してスクリプトを開始したことを確認しました。
USE [CTU SQL Project]
SELECT Advisors.First_Name, Advisors.Last_Name...and so on.
代わりに、次のようにテーブルを結合してみることができます。
select
....
from
dkcd
right join
a
, b
これはうまくいくはずです
私のエラーは、テーブルに存在しないフィールドを使用することでした。
table1.field1 =>は存在しません
table2.field1 =>は正しいです
テーブル名を修正してください。
wITHを使用しているためにエラーが発生しました
WITH RCTE AS (
SELECT...
)
SELECT RCTE.Name, ...
FROM
RCTE INNER JOIN Customer
ON RCTE.CustomerID = Customer.ID
他のテーブルと結合して使用すると...
私はまた、このエラーに苦しんでいたし、答えと同じ戦略になってしまいました。これがうまくいくはずの戦略であることを確認するためだけに、私は自分の答えを含めています。
これは、最初にデータを取得した2つのテーブル間で1つの内部結合を実行し、次に空になる可能性のある対応する行を持つ可能性のあるテーブルで2つの左外部結合を実行する例です。テーブル間でデフォルトのカンマ区切りの構文を使用して目的の結合で行を削除するのではなく、内部結合と外部結合を混在させて結果をテーブル全体のデータで取得します。
use somedatabase
go
select o.operationid, o.operatingdate, p.pasid, p.name as patientname, o.operationalunitid, f.name as operasjonsprogram, o.theaterid as stueid, t.name as stuenavn, o.status as operasjonsstatus from operation o
inner join patient p on o.operationid = p.operationid
left outer join freshorganizationalunit f on f.freshorganizationalunitid = o.operationalunitid
left outer join theater t on t.theaterid = o.theaterid
where (p.Name like '%Male[0-9]%' or p.Name like '%KFemale [0-9]%')
まず、データの一致が期待されるテーブル間の内部結合を行います。第2部:外部結合を続けて他のテーブルのデータを取得しようとしますが、テーブル外部結合が対応するデータを持っていない場合、またはon predicate/conditionで設定した条件に一致しない場合、結果セットは除外されません。