다중 부품 식별자를 바인딩 할 수 없습니다


196

나는 비슷한 오류를 보았지만 내 문제에 대한 해결책을 찾지 못했습니다. 다음과 같은 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"를 바인딩 할 수 없습니다. 왜?
추신 : 쿼리를 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;

않는 phuongxa테이블은 열을 포함 maxa?
Michael Petrotta

1
권리를 9월 5일 후 2011 년 - 당신이 MAXA으로 그룹을 추가하면 어떻게 통, 일
user710502

그렇습니다. 쿼리를 2 개의 하위 쿼리로
고안

잘못된 데이터베이스에서 실행중인 것 같습니다. 쿼리 시작 부분에 "USE [database name]"문을 추가하고 여전히 오류가 발생하는지 확인하십시오.
brian

1
아니요, 위에서 말한 것처럼 쿼리를 2 개의 개별 쿼리로 나누면 좋아요를 실행합니다.
PhamMinh

답변:


226

암시 적 조인과 명시 적 조인을 혼합하고 있습니다. 가능하지만 올바르게 수행하는 방법을 알고 있어야합니다.

문제는 명시 적 조인 ( 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 

즉, 이미 알 수있는 바와 같이 인 dkcd에 대하여 구체적으로 접합 bb, 다음의 결과와 함께 조인 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

여기에서 테이블 ab먼저 결합 된 다음 결과가에 결합됩니다 dkcd. 기본적으로 이것은 조인 중 하나에 대해 다른 구문 만 사용하는 것과 동일한 쿼리이며 큰 차이를 만듭니다 a.maxa. dkcd'조인 조건 의 참조 가 이제는 절대적으로 유효합니다.

@Aaron Bertrand가 올바르게 언급했듯이 절 에서 maxa특정 별칭 a을 사용할 수 ORDER BY있습니다.


ORDER BY maxa는 여전히 모호합니다. 또한 날짜로 '2011 년 9 월 1 일'에주의를 기울이고 다른 언어 / 지역 설정에서는 작동하지 않습니다.
Aaron Bertrand

@Aaron :에 대해 ORDER BY maxa감사합니다. 날짜에 관해서는 OP가 환경에서 지정하기 위해 선택한 방식이라고 생각합니다.
Andriy M

"명시 적 조인 ... 묵시적 조인보다 우선"-이에 대한 인용을 제공 할 수 있습니까? 예를 들어 SQL 표준에 정의되어 있거나 제품 기능입니까? 감사.
onedaywhen

1
@ onedaywhen : 나는 이것이 지금까지 내 측면에서 관찰 된 것 이상 일까 두려워. 나는 여기에서 조인의 우선 순위에 대해 먼저 이야기하지는 않지만 그 외에는 공식적인 확인을 스스로 발견하게되어 기쁩니다.
Andriy M

1
필자의 경우 SQL을 빌드하기 위해 문자열을 연결할 때 공백을 잊어 버렸습니다 .'FROM dbo.table_a a '+'INNER JOIN dbo.table_b b '는'FROM dbo.table_a aINNER JOIN dbo.table_b b ', 혼란 스러워서이 오류 메시지가 표시되었습니다. 세부 사항, 세부 사항, 세부 사항.
Guy Schalnat

40

때때로 쿼리에서 스키마 (dbo)를 잘못된 방식으로 사용할 때이 오류가 발생합니다.

예를 들어 다음과 같이 쓰는 경우 :

select dbo.prd.name
from dbo.product prd

오류가 발생합니다.

이 상황에서는 다음과 같이 변경하십시오.

select prd.name
from dbo.product prd

1
이것은 꽤 성가신 일이며 알아 내기에는 너무 오래 걸렸습니다. 고맙습니다. 가장 성가신 부분은 때때로 이것에 대해 잔소리가 있지만 다른 시간에 그것은
정상을

12

알리 이름을 지정한 경우 실제 이름으로 변경하십시오.

예를 들어

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;

1
또한 SQL 문자열을 작성하는 경우 줄 끝에 공백이 없는지 확인하십시오. 아래의 INNER JOIN 줄에 가입했을 때 내 별칭 M을 MINNER로 변환했습니다. 실행 된 문자열을 보여주는 SQL 프로파일 러가 내 문제를 해결하는 데 도움이되었습니다. (별명 v 실제 이름 문제와 관련하여 여기에 주석
Simon

와우 @Simon 고마워 이것에 대해 생각조차하지 않고 내 쿼리가 왜 작동하지 않는지 알아 내려고 벽에 머리를 부딪 혔습니다. 문자열 캐리지 리턴 중 하나 끝에 공백이 없습니다!
buradd

9

여러 조인이 있었기 때문에 SQL SERVER에서 동일한 오류 메시지로 어려움을 겪고 있었으므로 조인 순서를 변경하면 해결되었습니다.


3

필자의 경우 문제는 테이블에 부여한 별칭 이름으로 판명되었습니다. "oa"는 SQL Server에 적합하지 않은 것 같습니다.


2

JDBC에서 동일한 오류가 발생했습니다. 모든 것을 확인하고 내 쿼리는 괜찮 았습니다. where 절에서 논증이 있습니다.

where s.some_column = ?

그리고 내가 전달한 논쟁의 가치는 null이었습니다. 인터넷을 검색 할 때 쿼리 구조에 문제가 있지만 내 경우에는 그렇지 않기 때문에 잘못된 오류가 발생합니다. 누군가가 같은 문제에 직면 할 수 있다고 생각했습니다.


2

나를 위해 일한 것은 WHERE 절을 SELECT 하위 쿼리로 변경하는 것이 었습니다.

에서:

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

에:

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

1

SQL을 처음 사용했지만이 과정 에서이 문제가 발생하여 쿼리를 프로젝트에 할당하면 다중 부분 오류를 제거하는 데 특히 도움이된다는 것을 알았습니다. 예를 들어 내가 만든 프로젝트는 CTU SQL 프로젝트이므로 USE [CTU SQL Project]를 사용하여 아래 첫 줄로 스크립트를 시작했는지 확인했습니다.

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

1
"프로젝트"라고 말하면 투영이 아니라 데이터베이스를 의미한다고 가정합니다. use 문은 단순히 쿼리 범위를 지정할 데이터베이스를 다음과 같이 변경합니다.
Charleh

예, 내가 작업 한 데이터베이스와 같은 Charleh 프로젝트. 내 데이터베이스에서 내가 뭘 잘못하고 있는지 확신하지 못했지만 "사용"과 특정 데이터베이스를 사용하여 오류를 제거했습니다.
Bogartz 2016

1

이 오류가에서 발생하면 오류를 일으키는 열 / 필드가있는 테이블을 다시 UPDATE확인하십시오 JOIN.

필자의 경우 이것은 JOIN자체가 없기 때문에 알 수없는 필드 ( Andriy가 지적한 것처럼 ) 로 인해 동일한 오류가 발생했습니다 .


1

대신에 다음과 같은 테이블을 조인 할 수 있습니다.

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

이 작동합니다


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

여러 부분으로 묶인 문제가 발생하면 별칭을 사용하는 대신 테이블 이름 자체를 사용하십시오.
SVaidya

1

내 오류는 테이블에 존재하지 않는 필드를 사용하는 것이 었습니다.

table1.field1 =>가 존재하지 않습니다

table2.field1 => 맞습니다

테이블 이름을 수정하십시오.

WITH를 사용하여 오류가 발생했습니다.

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

다른 테이블과 함께 사용할 때 ...


1

테이블을 조인하는 것을 잊었습니까? 그렇지 않은 경우 아마도 일부 별칭을 사용해야합니다.


1

나는 또한이 오류로 어려움을 겪고 있었고 대답과 같은 전략으로 끝났습니다. 이것이 최선의 전략임을 확인하기 위해 답을 포함시키고 있습니다.

다음은 데이터를 얻은 것으로 알려진 두 테이블 사이에서 먼저 하나의 내부 조인을 수행 한 다음 비어있을 수있는 해당 행이있을 수있는 테이블에서 두 개의 왼쪽 외부 조인을 수행하는 예입니다. 내부 조인과 외부 조인을 혼합하여 테이블간에 기본 쉼표로 구분 된 구문을 수행하지 않고 원하는 데이터 조인 테이블에서 결과를 가져오고 원하는 조인에서 행을 누락시킵니다.

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]%')

첫째 : 데이터가 일치 할 것으로 예상되는 테이블간에 내부 조인을 수행하십시오. 두 번째 부분 : 다른 테이블에서 데이터를 검색하기 위해 외부 조인을 계속하지만 테이블 외부 조인에 대한 데이터가 없거나 술어 / 조건에 설정 한 조건과 일치하지 않으면 결과 세트를 필터링하지 않습니다.


0

이 오류는 ,SELECT 문에서 열 이름 사이 에 쉼표 가 누락되어 발생할 수도 있습니다 .

예 :

SELECT MyCol1, MyCol2 MyCol3 FROM SomeTable;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.