在我的SQL Server 2008
db中,我有2个表:
Order
Customer
Order
表的FK为CustomerID
。
我想在我的客户网格中禁用“删除”按钮,如果客户已经在1+订单中使用过。
该查询正在运行,但考虑到Order
表(+ 200.000记录/年)的未来增长,它是否可以改进?
SELECT c.CustomerID, c.Name,
CASE WHEN t.OrderID IS NULL THEN 0 ELSE 1 END AS 'HasOrders'
FROM Customer AS c
OUTER APPLY (
SELECT TOP 1 OrderID
FROM [Order] AS o
WHERE o.CustomerID = c.CustomerID
) AS t
答案 0 :(得分:3)
我认为以下查询是最快的方法,假设您有orders(CustomerID)
的索引:
SELECT c.CustomerID, c.Name,
(case when exists (select 1 from orders o where o.CustomerID = c.CustomerID)
then 1 else 0
end) as HasOrders
FROM Customers c;
您的outer apply
版本可能与此版本具有相同的效果。
关于风格的两个小评论。我建议你的表名为复数而不是单数(“客户”和“订单”)。这可以防止使用保留字作为表名。其次,您不需要引用“HasOrders”。如果你这样做,我会劝阻单引号。这些应该保留给字符串常量。
答案 1 :(得分:1)
我只想使用EXISTS
:
SELECT c.CustomerID, c.Name,
CASE WHEN EXISTS( SELECT 1 FROM Order o
WHERE o.CustomerID = c.CustomerID )
THEN 1 ELSE 0 END AS HasOrders
FROM Customer AS c
CustomerId
上的索引可能更有效,因为EXISTS
可以短路。