Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL中列名称不明确的查询错误_Sql_Sql Server_Tsql - Fatal编程技术网

SQL中列名称不明确的查询错误

SQL中列名称不明确的查询错误,sql,sql-server,tsql,Sql,Sql Server,Tsql,此查询(InvoiceID)出现不明确的列名错误。我不明白为什么。它们似乎都正确地连接在一起,那么为什么SSM不知道显示VendorID呢 查询: SELECT VendorName, InvoiceID, InvoiceSequence, InvoiceLineItemAmount FROM Vendors JOIN Invoices ON (Vendors.VendorID = Invoices.VendorID) JOIN InvoiceLineItems ON (Invoic

此查询(InvoiceID)出现不明确的列名错误。我不明白为什么。它们似乎都正确地连接在一起,那么为什么SSM不知道显示VendorID呢

查询:

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

Invoices
表和
invoiceslineitems
表中都有一列
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

很可能两个表都有同名的列。为每个表添加别名,并使用表别名调用每个列。

这是因为两个表上都存在一些字段(特别是发票表和发票行项目上的发票ID)。回答问题的方法是在其上添加一个
别名

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

因为您要联接两个表Invoices和InvoiceLineItems,这两个表都包含InvoiceID。更改为Invoices.InvoiceID以使其正确。

当我们通过联接表从多个表中选择数据时,会遇到此错误,并且至少有一个选定列(使用*选择所有列时也会发生)在多个表(我们的选定/联接表)中具有相同名称。在这种情况下,我们必须指定从哪个表中选择列

以下是上述概念的示例解决方案实施

我认为只有
InvoiceID
中存在歧义,而
InvoiceLineItems
Invoices
中的其他字段似乎不同。所以试试这个

我只是用发票替换InvoiceID。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,而无需使用任何别名。但是,如果您加入了两个或多个表,并且它们的列具有相似的名称,SQL server希望您限定它们所属的列,则可以按照其他答案使用别名

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

如果事件和单位表具有相同的列名(ID),SQL server希望您使用别名。

您的一个表具有相同的列名,这会在查询中混淆您所指的表的哪些列。复制此代码并运行它

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

之所以会出现这种情况,是因为在查询中,有多个表中有同名的字段,这是因为存在联接,所以您应该以不同的方式引用这些字段,并为这些表命名(别名)。

是的,谢谢。我不想使用别名,因为我希望列名保持InvoiceID。不客气。我没有使用别名,只是因为我觉得你使用别名不方便。我本来打算编辑你的答案,但我的答案太不一样了,所以我发布了取消编辑并发布了答案。可能有点晚了<代码>我需要您的一些指导。。为什么这个问题得到这么多选票?问是因为我下次问问题时会跟着问。@sami也许问题很清楚。OP包含了足够的关于这个问题的信息。@Sami-对堆栈溢出的投票有些反复无常和不可预测。不可能知道为什么这个问题得到了5票。很可能有很多类似的问题也得到了反对票(毕竟,如果OP检查了任何相关的问题链接,他们就会得到答案),谢谢@MartinSmith Off-course。这就是我的观点,这个问题可以很容易地搜索到,即使在写标题为“模棱两可的列名”的这些词时,也必须显示出类似的问题已经得到了回答。我从约翰那里得到了很好的观点,但是我不太同意投票表决这样一个问题,即使内容非常清楚。直到问题看起来有点价值或特别。这是所有答案中最简单的。