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

나는 비슷한 오류를 보았지만 내 문제에 대한 해결책을 찾지 못했습니다. 다음과 같은 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;



답변

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

문제는 명시 적 조인 ( 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있습니다.


답변

때때로 쿼리에서 스키마 (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에 적합하지 않은 것 같습니다.


답변

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

where s.some_column = ?

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


답변

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

에서:

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

에:

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