EXISTS子句与子查询中的TOP子句一起发布

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

我在下面有一个查询子查询(目的是从货运价= 2的订单表中搜索前2个订单,并获得这些订单的客户)

  1. 使用IN子句的工作查询
    SELECT *
    FROM Customers C
    WHERE C.CUST_ID IN (
      SELECT TOP 2 CUST_ID
      FROM Orders O
      where FREIGHT_CHARGES = 2
    ) 

但是我想将IN子句转换为更有效的EXISTS子句

  1. 代码不适用于exists子句
    SELECT *
    FROM Customers C
    WHERE EXISTS (
        SELECT TOP 2 CUST_ID
        FROM Orders O
        where FREIGHT_CHARGES = 2 AND C.CUST_ID = O.CUST_ID
    )

在第二个查询的情况下,我没有检索前2个cust_id,但所有记录。

[请让我知道任何实现以获得期望结果的方法。

sql-server exists correlated-subquery
3个回答
0
投票
SELECT * FROM Customers C WHERE EXISTS ( SELECT 1 FROM Orders O JOIN Orders O2 ON O.FREIGHT_CHARGES = O2.FREIGHT_CHARGES AND O.CUST_ID = O.CUST_ID AND O.ID <> O2.ID where O.FREIGHT_CHARGES = 2 AND C.CUST_ID = O.CUST_ID )

SELECT * FROM Customers C WHERE EXISTS ( SELECT 1 FROM Orders O where FREIGHT_CHARGES = 2 AND C.CUST_ID = O.CUST_ID GROUP BY FREIGHT_CHARGES, CUST_ID HAVING COUNT(1) > 1 )

您必须测试您的情况下哪个更好

0
投票
SELECT TOP 2 C.* FROM Customers C INNER JOIN Orders O ON C.CUST_ID = O.CUST_ID WHERE O.FREIGHT_CHARGES = 2 ORDER BY C.CUST_ID -- Use 'ORDER BY' clause if 'C.CUST_ID' column does not have clustered index or you can use any other column

请让我知道您的反馈。


0
投票
就您而言,EXISTS将不是您的理想选择。

请检查此链接:https://www.sqlservertutorial.net/sql-server-basics/sql-server-exists/

© www.soinside.com 2019 - 2024. All rights reserved.