web-dev-qa-db-ja.com

マルチパート識別子をバインドできませんでした

私は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;
172
PhamMinh

暗黙的結合と明示的結合が混在しています。それは許可されていますが、それを正しく行う方法を知っておく必要があります。

つまり、明示的結合(JOINキーワードを使用して実装されている結合)は、暗黙的結合(WHERE節で結合条件が指定されている「コンマ」結合)よりも優先されます。

クエリの概要は次のとおりです。

SELECT
  …
FROM a, b LEFT JOIN dkcd ON …
WHERE …

あなたはおそらくそれがこのように振る舞うと期待している:

SELECT
  …
FROM (a, b) LEFT JOIN dkcd ON …
WHERE …

つまり、テーブルabの組み合わせは、テーブルdkcdと結合されます。実際、何が起こっているのですか

SELECT
  …
FROM a, (b LEFT JOIN dkcd ON …)
WHERE …

つまり、すでにご存知のとおり、dkcdbに対してのみ結合され、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

ここではテーブルabが最初に結合され、次に結果がdkcdに結合されます。基本的に、これはあなたのものと同じ問い合わせで、結合の1つに異なる構文を使用するだけで、大きな違いがあります:dkcdの結合条件における参照a.maxaは絶対に有効です。

@Aaron Bertrandが正しく指摘しているように、あなたはおそらくmaxaORDER BY節で特定のエイリアス、おそらくaで修飾するべきです。

200
Andriy M

クエリでスキーマ(dbo)を間違った方法で使用したときに、このエラーが発生することがあります。

たとえば、次のように書きます。

select dbo.prd.name
from dbo.product prd

エラーになります。

このような場合は、次のように変更してください。

select prd.name
from dbo.product prd
37
Bobs

あなたがエイリアス名を与えた場合、それを実際の名前に変更してください

例えば

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で同じエラーメッセージに悩んでいました。

7
Pavel M.

私の場合、問題は私がテーブルに付けたエイリアス名であることがわかりました。 "oa"はSQL Serverには受け入れられないようです。

3
Hashim Akhtar

私にとって効果的だったのは、WHERE句をSELECTサブクエリに変更することでした。

から:

    DELETE FROM CommentTag WHERE [dbo].CommentTag.NoteId = [dbo].FetchedTagTransferData.IssueId

に:

    DELETE FROM CommentTag WHERE [dbo].CommentTag.NoteId = (SELECT NoteId FROM FetchedTagTransferData)
2
SauerTrout

私はJDBCから同じエラーを抱えていました。すべてを確認し、私の質問は大丈夫だった。結局、where節に引数があります。

where s.some_column = ?

そして私が渡していた引数の値はnullでした。あなたがインターネットを検索するとき、あなたは何かがクエリ構造で間違っているということになるので、これはまた誤解を招く同じエラーを与えますが、それは私の場合ではありません。誰かが同じ問題に直面するかもしれないと思った

2
xbmono

このエラーがUPDATEで発生した場合は、エラーの原因となっている列/フィールドを含むテーブルのJOINを再確認してください。

私の場合、これはJOIN自体が欠如しているためで、未知のフィールドが原因で同じエラーが発生しました( Andriyが指摘したように )。

1
CPHPython

いくつかのテーブルへの参加を忘れましたか。そうでない場合は、おそらくいくつかのエイリアスを使用する必要があります。

1
Tadej
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;
1
SVaidya

私はSQLに慣れていませんが、私がとっていたコースでこの問題に遭遇し、プロジェクトにクエリを割り当てることがマルチパートエラーを排除するのに特に役立つことがわかった。たとえば、私が作成したプロジェクトはCTU SQL Projectなので、次のように最初の行としてUSE [CTU SQL Project]を使用してスクリプトを開始したことを確認しました。

USE [CTU SQL Project]
SELECT Advisors.First_Name, Advisors.Last_Name...and so on.
1
Bogartz

代わりに、次のようにテーブルを結合してみることができます。

select 
  .... 
from 
   dkcd 
     right join 
                a
                  , b

これはうまくいくはずです

1
Suman Kumar

私のエラーは、テーブルに存在しないフィールドを使用することでした。

table1.field1 =>は存在しません

table2.field1 =>は正しいです

テーブル名を修正してください。

wITHを使用しているためにエラーが発生しました

WITH RCTE AS (
   SELECT...
)
SELECT RCTE.Name, ...
FROM 
  RCTE INNER JOIN Customer
  ON RCTE.CustomerID = Customer.ID 

他のテーブルと結合して使用すると...

1
Zolfaghari

私はまた、このエラーに苦しんでいたし、答えと同じ戦略になってしまいました。これがうまくいくはずの戦略であることを確認するためだけに、私は自分の答えを含めています。

これは、最初にデータを取得した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で設定した条件に一致しない場合、結果セットは除外されません。

1
Tore Aurstad