我在下面有一个查询子查询(目的是从货运价= 2的订单表中搜索前2个订单,并获得这些订单的客户)
SELECT *
FROM Customers C
WHERE C.CUST_ID IN (
SELECT TOP 2 CUST_ID
FROM Orders O
where FREIGHT_CHARGES = 2
)
但是我想将IN子句转换为更有效的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,但所有记录。
[请让我知道任何实现以获得期望结果的方法。
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
)
您必须测试您的情况下哪个更好
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
请让我知道您的反馈。
请检查此链接:https://www.sqlservertutorial.net/sql-server-basics/sql-server-exists/