检查是否从另一个表引用了记录

时间:2013-12-21 00:02:08

标签: sql sql-server tsql

在我的SQL Server 2008 db中,我有2个表:

  1. Order
  2. Customer
  3. 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
    

2 个答案:

答案 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可以短路。