【问题标题】:Return same select if exists如果存在则返回相同的选择
【发布时间】:2022-01-03 14:25:56
【问题描述】:

有这样的查询:

IF EXISTS(SELECT * FROM [MyTable] WHERE Property=1)
    BEGIN
        SELECT * FROM [MyTable] WHERE Property=1
    END
else
    begin
        SELECT * FROM [MyTable] WHERE Property= (SELECT Property FROM [OtherTable] where OtherProperty = 1)
    end

是否可以修改它以不进行两次相同的选择?

【问题讨论】:

  • 这取决于,第二个SELECTWHERE 是什么?尽管使用正确的索引,像上面这样的东西可以提高性能。
  • @Larnu 这是从其他表中的子选择,我已将详细信息添加到问题中
  • 如果您关心性能,那么您可以在 Exists 语句中使用“Select top 1 1 From”而不是“Select * From”。
  • @AntonGrig 至少在 MS SQL Server 中,在 EXISTS 查询中使用 TOP 没有区别。在EXISTS 查询中使用SELECT 1SELECT * 也没有区别。
  • @Richard 认为确实如此。感谢您的评论,现在我已经填补了这个空白。

标签: sql-server select sql-server-2012 exists


【解决方案1】:

试试这个,

DECLARE @Property INT= 1;
DECLARE @LocalProperty INT;
IF EXISTS
(
    SELECT 1
    FROM [MyTable]
    WHERE Property = @Property
)
    BEGIN
        SET @LocalProperty = @Property;
    END;
    ELSE
    BEGIN
        SELECT @LocalProperty = Property
        FROM [OtherTable]
        WHERE OtherProperty = @Property;
    END;
SELECT *
FROM [MyTable]
WHERE Property = @LocalProperty;

【讨论】:

    【解决方案2】:

    您可以使用合并串联来执行此操作。只需用UNION ALL 连接两个查询,在ORDER BY 中添加排序列,然后在SELECT TOP (1) WITH TIES 中添加一个排序列

    SELECT TOP (1) WITH TIES`
      *
    FROM (
        SELECT *, 1 AS Ordering
        FROM [MyTable] t
        WHERE Property = 1
    
        UNION ALL
    
        SELECT *, 2
        FROM [MyTable]
        WHERE Property = (
            SELECT Property
            FROM [OtherTable]
            where OtherProperty = 1)
    ) t
    ORDER BY Ordering;
    

    如果第二个查询中的Property 保证为>= 1,那么您可以合而为一,ORDER BY Property

    SELECT TOP (1) WITH TIES`
      *
    FROM [MyTable] t
    WHERE Property IN (
     1,
     (
         SELECT Property
         FROM [OtherTable]
         where OtherProperty = 1
      )
    ORDER BY Property;
    

    我建议你在Property 上建立一个索引,并带有相关的INCLUDEs 来支持这个查询

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-31
      • 2014-02-21
      • 1970-01-01
      • 1970-01-01
      • 2015-07-02
      相关资源
      最近更新 更多