【发布时间】:2010-08-23 09:57:51
【问题描述】:
我有一个表格,里面有一些数据:
科尔A |科尔B |科尔C ------+------+------ 1 |一个 | X 2 |一个 |是 3 |乙|是 4 | C |是 5 | C | Z 6 | D |是 7 | D | Z我想查询以获取 ColB 和 ColC 成对匹配条件的所有行:
SELECT * FROM [Table]
WHERE (ColB = A AND ColC = Y)
OR (ColB = B AND ColC = Y)
OR (ColB = C AND ColC = Y)
OR (ColB = D AND ColC = Z)
这应该返回第 2、3、4 和 7 行。
(ColB, ColC) 的值对可能很大(在 ~100 范围内)。除了包含大量OR 条件的大型查询之外,还有更有效的方法来查询这些数据吗?
我希望有一种方法可以使用元组的等价物,这意味着我可以执行以下操作:
SELECT * FROM [Table]
WHERE (ColB, ColC) IN ({A, Y}, {B, Y}, {C, Y}, {D, Z})
有什么想法吗?
编辑:(回答 cmets 中的一些问题)
ColB 和 ColC 的字段存储 guid 并声明为 uniqueidentifier 类型。
这需要在 SQL Server 2005 以上(所有版本)上工作。
该表有数百万行,我不反对添加任何所需的索引。
【问题讨论】:
-
您能否提供 ColB 和 ColC 的数据类型?如果它们是文本,也许使用正则表达式可以帮助你,但我对 sql-server 知之甚少,无法说出它们是否支持正则表达式、扩展程度或方式。
-
什么版本的 SQL Server?你有什么索引?你想强制执行什么计划? 100 次索引查找或索引扫描?表中有多少条记录?
-
还有几个问题。
ColB或ColC是唯一的吗?如果不是,这对组合是唯一的吗? -
@Martin:
ColB和ColC在表中不是唯一的,但它们两者的组合是。
标签: sql sql-server performance tuples