나는 비슷한 오류를 보았지만 내 문제에 대한 해결책을 찾지 못했습니다. 다음과 같은 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 …
즉, 테이블의 조합이며 테이블 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
. 기본적으로 이것은 조인 중 하나에 대해 다른 구문 만 사용하는 것과 동일한 쿼리이며 큰 차이를 만듭니다 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)