2012-09-30 10 views
19

Otrzymuję błąd dwuznacznej kolumny z tym zapytaniem (faktura). Nie rozumiem dlaczego. Wygląda na to, że wszystkie są prawidłowo połączone, więc dlaczego studio zarządzania nie wyświetla komunikatu VendorID? Każda pomoc będzie bardzo ceniona.Błąd zapytania z niejednoznaczną nazwą kolumny w SQL

Zapytanie:

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 

Odpowiedz

29

Myślę, że masz niejednoznaczność tylko w InvoiceID. Inne dziedziny wydają się różne. Więc spróbuj tego

po prostu zastąpić InvoiceID z 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 

Można użyć tablename.columnnae dla wszystkich kolumn (w wyborze, gdzie grupa przez i uporządkuj) bez użycia aliasu. Możesz jednak użyć aliasu, jak przy innych odpowiedziach:

+0

Tak i dziękuję. Nie chciałem używać aliasu, ponieważ chciałem, aby nazwa kolumny pozostała InvoiceID. – jaielob

+0

Nie ma za co. Nie użyłem pseudonimu tylko dlatego, że czułem, że nie czujesz się dobrze z pseudonimem – Sami

+0

. To naprawdę zadziałało. Jestem nowy w SQL, nauczyłem się dzisiaj czegoś nowego. :) – satwal

6

mieć kolumnę InvoiceID w tabeli Invoices a także w tabeli InvoiceLineItems. Mechanizm wykonywania zapytań nie ma możliwości sprawdzenia, który z nich ma zostać zwrócony.

Dodawanie alias tabela pomoże:

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

Widzę, dziękuję. – jaielob

3

Najprawdopodobniej obie tabele mają kolumny o tej samej nazwie. Alias ​​każdej tabeli i wywołaj każdą kolumnę za pomocą aliasu tabeli.

3

to dlatego, że niektóre pola (konkretnie InvoiceID na Faktury tabeli i na InvoiceLineItems) są obecne zarówno na stół. Sposobem na odpowiedź na pytanie jest dodanie na nim 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

Zamierzałem edytować twoją odpowiedź, ale moja była zbyt różna, dlatego opublikowałem anulowaną edycję i opublikowałem odpowiedź. Być może było trochę późno. 'Chciałbym otrzymać od ciebie małe wskazówki '.. Z jakiego powodu to pytanie ma tyle głosów? Pytając, bo podążałbym za nim, zadając pytanie następnym razem. – Sami

+1

@Sami odpowiedź jest bardzo jasna niż moja :) –

+0

@sami może to pytanie jest jasne. a PO zawiera wystarczającą ilość informacji dotyczących pytania. –

4

Ponieważ dołączysz do dwóch tabel Faktury i FakturyLineItems, które zawierają Faktury Invoice. zmienić na Faktury.Zatwierdzenie faktury, aby było prawidłowe.

1

jeśli dołączasz 2 lub więcej tabel i mają one podobne nazwy dla swoich kolumn, serwer SQL chce, abyś zakwalifikował kolumny, do których należą.

SELECT ev.[ID] 
    ,[Description] 
    FROM [Events] as ev 
    LEFT JOIN [Units] as un ON ev.UnitID = un.UnitId 

Jeśli tabele zdarzeń i jednostek mają tę samą nazwę kolumny (identyfikator), serwer SQL chce, abyś używał aliasów.

Powiązane problemy