sql - 更快的查询计划?
问题描述
简单的问题。我有一个数据库,我正在尝试从 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 可以用这个吗?可能还有交叉申请?
解决方案
您标记了 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)
.
推荐阅读
- asp.net-web-api - 有没有办法从同一网络的多个设备中检索 cookie?
- assembly - 当我在 C 中调用 ASM 函数时,参数不会出现在堆栈上
- firebase - 我遇到了一个问题,当我尝试将项目链接到 Firebase 时,我看到了这个错误
- c# - 转换为正确的 DateTime 格式时的歧义
- amazon-web-services - 将多台机器上的远程文件夹同步到一个 AWS 实例
- javascript - React reduce、replace 和 wrap in span
- java - com.google.firebase.database.DatabaseException: Can't convert of object of type java.lang.String to type com.NoteModelActivity 突然出现错误
- python - 我的工作脚本不会从快捷方式启动
- sql - 用于检查值是否为 0 或唯一的 T-SQL 约束
- yii2 - I am not connecting to a database in yii2