我有一张像:
ID A0 A1 A2 A3 A4
14 A B A C A
15 A A A A A
Run Code Online (Sandbox Code Playgroud)
我需要比较所有 5 列并检查它们是否具有相同的值并检索唯一具有所有相同值的列......在这种情况下 ID 为 15 的列。有没有办法在 T-SQL 中实现这一点?
Vér*_*ace 12
我不熟悉 SQL Server 的 SQL 品牌,但它必须是这样的:
SELECT ID FROM My_Table
WHERE
(A0 = A1) AND
(A1 = A2) AND
(A2 = A3) AND
(A3 = A4);
Run Code Online (Sandbox Code Playgroud)
查看此dbfiddle.uk,其中显示了答案线程中的所有答案。
Pau*_*ite 11
鉴于样本数据:
CREATE TABLE dbo.Data
(
ID integer PRIMARY KEY,
A0 character(1) NULL,
A1 character(1) NULL,
A2 character(1) NULL,
A3 character(1) NULL,
A4 character(1) NULL
);
INSERT dbo.Data
(ID, A0, A1, A2, A3, A4)
VALUES
(14, 'A', 'B', 'A', 'C', 'A'),
(15, 'A', 'A', 'A', 'A', 'A');
Run Code Online (Sandbox Code Playgroud)
比较所有非 ID 列是否相等的另一种方法是:
SELECT
D.*
FROM dbo.Data AS D
WHERE EXISTS
(
-- All columns except the last one
SELECT D.A0, D.A1, D.A2, D.A3
INTERSECT
-- All columns except the first one
SELECT D.A1, D.A2, D.A3, D.A4
);
Run Code Online (Sandbox Code Playgroud)
如果有很多列,这可能比具有多个AND子句的查询更容易编写(并且通常更紧凑)。在 Management Studio 中,您可以将“列”节点从对象资源管理器拖到文本窗口以生成逗号分隔的列列表。抵消第二部分的列表INTERSECT也是微不足道的。
此查询生成的执行计划与多AND子句版本一样有效。在语义上,它略有不同,因为NULL数据项将彼此相等。

我可以建议另一种解决方案。您可以使用COMPUTED COLUMN. 当然,这是如果您可以修改表结构并且您会经常进行这种比较。
在 中,COMPUTED COLUMN您可以计算需要比较的所有列是否包含相同的数据boolean value。之后,您只需在查询中比较该值。
此外,如果您设置persistent option了该值,则每次更改数据时都会计算并存储该值。在这种情况下,将会有存储开销。
关于COMPUTED COLUMNS你可以在这里阅读例如
编辑:
作为Vérace和伊恩林格罗塞说-如果有一个filtered index上COMPUTED COLUMN(在这种情况下它必须是persistent)你可以受益性能。当然要有足够的数据量。