Подтвердить что ты не робот

Ошибка запроса с неоднозначным именем столбца в SQL

Я получаю неоднозначную ошибку имени столбца с этим запросом (InvoiceID). Я не могу понять, почему. Кажется, что все они подключены правильно, так почему же не знает, что для управляющей студии для отображения VendorID? Любая помощь будет принята с благодарностью.

Query:

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
4b9b3361

Ответ 1

Я думаю, что у вас двусмысленность только в InvoiceID. Другие поля кажутся разными. Поэтому попробуйте

Я просто заменю InvoiceID на 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

Вы можете использовать tablename.columnnae для всех столбцов (в выборе, где, по группам и по порядку) без использования псевдонима. Однако вы можете использовать псевдоним, руководствуясь другими ответами.

Ответ 2

У вас есть столбец InvoiceID в таблице Invoices, а также в таблице InvoiceLineItems. Механизм выполнения запроса не знает, какой из них вы хотите вернуть.

Добавление псевдонима таблицы поможет:

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

Ответ 3

Поскольку вы соединяете две таблицы Invoices и InvoiceLineItems, которые содержат InvoiceID. измените на Invoices.InvoiceID, чтобы сделать его правильным.

Ответ 4

Скорее всего, обе таблицы имеют столбец с тем же именем. Псевдоним каждой таблицы и вызовите каждый столбец с псевдонимом таблицы.

Ответ 5

потому что некоторые из полей (в частности, InvoiceID в таблице Invoices и на InvoiceLineItems) присутствуют на обеих таблицах. Способ ответа на вопрос состоит в том, чтобы добавить на него 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

Ответ 6

если вы присоединитесь к 2 или более таблицам и у них есть похожие имена для своих столбцов, сервер sql хочет, чтобы вы соответствовали столбцам, к которым они принадлежат.

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

если таблицы Events и Units имеют одинаковое имя столбца (ID) SQL-сервер, вы хотите использовать псевдонимы.

Ответ 7

Одна из ваших таблиц имеет такое же имя столбца, что приводит к путанице в запросе относительно того, на какие столбцы таблиц вы ссылаетесь. Скопируйте этот код и запустите его.

SELECT 
    v.VendorName, i.InvoiceID, iL.InvoiceSequence, iL.InvoiceLineItemAmount
FROM Vendors AS v
JOIN Invoices AS i ON (v.VendorID = .VendorID)
JOIN InvoiceLineItems AS iL ON (i.InvoiceID = iL.InvoiceID)
WHERE  
    I.InvoiceID IN
        (SELECT iL.InvoiceSequence 
         FROM InvoiceLineItems
         WHERE iL.InvoiceSequence > 1)
ORDER BY 
    V.VendorName, i.InvoiceID, iL.InvoiceSequence, iL.InvoiceLineItemAmount

Ответ 8

Это происходит потому, что в запросе есть поля с одинаковыми именами в нескольких таблицах из-за объединений, поэтому вы должны ссылаться на поля по-разному, давая имена (псевдонимы) таблицам.