对于像您这样的大型数据集,使用以下查询可能会以合理的性能提供您想要的结果 -
SELECT ta1.TrId AS TrId
FROM dbo.TableA AS ta1
LEFT JOIN dbo.TableA AS ta2 ON (ta2.TrId = ta1.TrId AND ta2.[Status] != 3)
WHERE ta2.TrId IS NULL;
首先,自连接通过将所有状态(3 或 0、1 等)排列在同一行中来创建表。过滤器
ta2.[Status] != 3
如果 Status 为 3,则在 join 子句中为 ta2.TrId(或 ta2.*)设置 NULL。
+------+--------+------+--------+
| TrId | Status | TrId | Status |
+------+--------+------+--------+
| 2345 | 3 | 2345 | 0 |
| 567 | 3 | 567 | 0 |
| 567 | 0 | 567 | 0 |
| 2345 | 0 | 2345 | 0 |
| 99 | 3 | NULL | NULL |
| 778 | 0 | 778 | 0 |
+------+--------+------+--------+
然后使用以下过滤器选择出现 NULL 的行。
WHERE ta2.TrId IS NULL
由于它是自 LEFT JOIN,因此左表包含所有行,但对于连接条件不符合的右表值,左表为 NULL。