如何将使用联接语句的查询转换为使用子查询的查询?

问题描述 投票:0回答:2

我得到查询

SELECT DISTINCT InvoiceNumber, InvoiceDate, InvoiceTotal
    FROM Invoices JOIN InvoiceLineItems
        ON Invoices.InvoiceID = InvoiceLineItems.InvoiceID
    WHERE InvoiceLineItemAmount > 50
    ORDER BY InvoiceTotal

并要求使用子查询重写它。我尝试写

SELECT DISTINCT InvoiceNumber, InvoiceDate, InvoiceTotal
FROM Invoices 
WHERE InvoiceLineItemAmount >  <-----------get error saying the column isn't recognized
    (SELECT InvoiceLineItemAmount
     FROM InvoiceLineItems
     WHERE InvoiceLineItemAmount > 50)
ORDER BY InvoiceTotal

但是我收到错误消息说无法识别该列?

sql sql-server
2个回答
1
投票
您正在尝试访问子查询(或内部查询)表的外部列,并因此导致错误。

请尝试以下方法:

SELECT i.InvoiceNumber, i.InvoiceDate, i.InvoiceTotal FROM Invoices i WHERE i.InvoiceID in (select InvoiceID from InvoiceLineItems where InvoiceLineItemAmount > 50) ORDER BY i.InvoiceTotal


0
投票
[C0在有金额大于50的订单项时找到匹配项。这表明与JOIN相关的子查询:

EXISTS

请注意,不再需要SELECT i.InvoiceNumber, i.InvoiceDate, i.InvoiceTotal
FROM Invoices i
WHERE EXISTS (SELECT 1
              FROM InvoiceLineItems ili
              WHERE ili.InvoiceID = i.InvoiceID AND
                    ili.InvoiceLineItemAmount > 50
             )
ORDER BY i.InvoiceTotal;
。使用正确的索引,它应该比原始版本快得多。
© www.soinside.com 2019 - 2024. All rights reserved.