2012-09-30 3 views
19

이 쿼리 (InvoiceID)에 모호한 열 이름 오류가 발생합니다. 나는 이유를 알 수 없다. 그들은 모두 올바르게 결합 된 것처럼 보이므로 경영진이 VendorID를 표시해야하는 이유는 무엇입니까? 어떤 도움이라도 대단히 감사하겠습니다.SQL의 모호한 열 이름에 대한 쿼리 오류

검색어 :

SELECT 
    VendorName, InvoiceID, InvoiceSequence, InvoiceLineItemAmount 
FROM Vendors 
JOIN Invoices ON (Vendors.VendorID = Invoices.VendorID) 
JOIN InvoiceLineItems ON (Invoices.InvoiceID = InvoiceLineItems.InvoiceID) 
WHERE 
    Invoices.InvoiceID IN 
     (SELECT InvoiceSequence 
     FROM InvoiceLineItems 
     WHERE InvoiceSequence > 1) 
ORDER BY 
    VendorName, InvoiceID, InvoiceSequence, InvoiceLineItemAmount 

답변

29

나는 당신이 InvoiceID에서만 모호성이 있다고 생각합니다. 다른 필드는 뚜렷하게 보입니다. 그래서 당신은 모든 열에 대해 tablename.columnnae을 사용할 수 있습니다 난 그냥 Invoices.InvoiceID

SELECT 
     VendorName, Invoices.InvoiceID, InvoiceSequence, InvoiceLineItemAmount 
    FROM Vendors 
    JOIN Invoices ON (Vendors.VendorID = Invoices.VendorID) 
    JOIN InvoiceLineItems ON (Invoices.InvoiceID = InvoiceLineItems.InvoiceID) 
    WHERE 
     Invoices.InvoiceID IN 
      (SELECT InvoiceSequence 
      FROM InvoiceLineItems 
      WHERE InvoiceSequence > 1) 
    ORDER BY 
     VendorName, Invoices.InvoiceID, InvoiceSequence, InvoiceLineItemAmount 

을 InvoiceID 대체이

시도 (선택의 경우, GROUP BY와 ORDER BY) 별칭을 사용하지 않고. 그러나 다른 답변에 따라 별칭을 사용할 수 있습니다.

+0

예, 감사합니다. 필자는 열 이름이 InvoiceID로 남아 있기 때문에 별칭을 사용하고 싶지 않았습니다. – jaielob

+0

당신은 오신 것을 환영합니다. 나는 별칭을 사용하지 않았다. 당신이 별칭으로 편리하다고 느끼지 않는다고 느꼈다. – Sami

+0

이것은 정말로 나를 위해 일했다. SQL에 익숙하지 않고 새로운 것을 배웠습니다. :) – satwal

6

는 당신은 Invoices 테이블 또한 InvoiceLineItems 테이블의 열 InvoiceID가있다. 쿼리 실행 엔진이 반환 할 쿼리 실행 엔진을 알 수있는 방법은 없습니다.

테이블 별칭 도움이 될 것입니다 추가 :

SELECT V.VendorName, I.InvoiceID, IL.InvoiceSequence, IL.InvoiceLineItemAmount 
FROM Vendors V 
JOIN Invoices I ON (...) 
JOIN InvoiceLineItems IL ON (...) 
WHERE ... 
ORDER BY V.VendorName, I.InvoiceID, IL.InvoiceSequence, IL.InvoiceLineItemAmount 
+1

감사합니다. – jaielob

3

는 대부분의 경우 두 테이블은 같은 이름의 열이. 각 테이블의 별칭을 지정하고 각 별칭을 테이블 별칭으로 호출합니다.

3

일부 필드 (특히 인보이스 표에 상기 InvoiceLineItems을 InvoiceID에) 그것 때문에 두 테이블에 존재한다. 질문에 대답하는 방법은 ALIAS을 추가하는 것입니다.

SELECT 
    a.VendorName, Invoices.InvoiceID, .. -- or use full tableName 
FROM Vendors a -- This is an `ALIAS` of table Vendors 
JOIN Invoices ON (Vendors.VendorID = Invoices.VendorID) 
JOIN InvoiceLineItems ON (Invoices.InvoiceID = InvoiceLineItems.InvoiceID) 
WHERE 
    Invoices.InvoiceID IN 
     (SELECT InvoiceSequence 
     FROM InvoiceLineItems 
     WHERE InvoiceSequence > 1) 
ORDER BY 
    VendorName, InvoiceID, InvoiceSequence, InvoiceLineItemAmount 
+0

나는 당신의 답을 편집하려고했으나 나의 것이 너무 달랐기 때문에 편집을 취소하고 게시 된 답변을 게시했다. 아마도 조금 늦었을 것입니다. '제발 당신 한테 조금 안내하길 바래요. '.. 왜이 질문에 득표가 많은가? 다음 번에 물어 보는 동안 그것을 따라갈 것이기 때문에 묻습니다. – Sami

+1

@Sami 당신의 대답은 제 것보다 아주 분명합니다 :) –

+0

@sami 아마도 질문은 분명합니다. OP에는 질문에 관한 충분한 정보가 포함되어 있습니다 .. –

4

둘 다 InvoiceID가 들어있는 Invoices와 InvoiceLineItems 두 테이블을 조인하기 때문에. 올바른 지 확인하려면 Invoices.InvoiceID로 변경하십시오.

1

두 개 이상의 테이블을 조인하고 해당 열의 이름이 비슷한 경우 SQL Server는 사용자가 속한 열을 한정하기를 원합니다.

이벤트 및 단위 테이블에 동일한 열 이름 (ID)이있는 경우 SQL Server는 별칭을 사용하기를 원합니다.