首页 > 解决方案 > 更快的查询计划?

问题描述

简单的问题。我有一个数据库,我正在尝试从 3 行中的表中获取所有事件。

RECEIPT | ORIGINAL_RECEIPT | EXCHANGED_RECEIPT

51651651 |     1245678      |   58453874

我现在使用的查询完美且非常快

select distinct RECEIPT from RECEIPT_DATA WHERE ORIGINAL_RECEIPT = '1245678'
UNION
select distinct ORIGINAL_RECEIPT from RECEIPT_DATA WHERE ORIGINAL_RECEIPT = '1245678'
UNION
select distinct EXCHANGED_RECEIPT from RECEIPT_DATA WHERE ORIGINAL_RECEIPT = '1245678'
order by RECEIPT asc

然后应该返回

51651651
1245678 
58453874     

显然,我的行数更多,而且 ORIGINAL_RECEIPT 可能有很多交换和所有。

就像我说的那样,这很完美,但我只是好奇还有什么其他的方法呢?有没有不搜索数据库3次?我听说 case 可以用这个吗?可能还有交叉申请?

标签: sqlsql-server

解决方案


您标记了 SSMS,所以我会使用 useAPPLY而不是UNION

SELECT DISTINCT RDD.RECEIPTS
FROM RECEIPT_DATA RD CROSS APPLY 
     ( VALUES (RECEIPT), (ORIGINAL_RECEIPT), (EXCHANGED_RECEIPT) 
     ) RDD(RECEIPTS)
WHERE RD.ORIGINAL_RECEIPT = 1245678;

DISTINCT自从您使用以来确实没有必要UNION,因此它会为您删除重复项。

但是,为了获得更好的性能,您需要在RECEIPT_DATA(ORIGINAL_RECEIPT).


推荐阅读