如何在SQL Server中搜索/选择复合索引值列表并获得精确匹配的行?
我有一个值对列表,必须在SQLServer的表中搜索。表格是这样的:如何在SQL Server中搜索/选择复合索引值列表并获得精确匹配的行?,sql,sql-server,Sql,Sql Server,我有一个值对列表,必须在SQLServer的表中搜索。表格是这样的: | id | class | value | | 1 | A | 300 | | 2 | A | 400 | | 1 | B | 500 | | 2 | B | 350 | | 1 | C | 230 | | 2 | C | 120 | 列id和类有一个我想利用的唯一复合索引。现在我有了这个id类对的列表,我必须从这个表中获得: (1, A)
| id | class | value |
| 1 | A | 300 |
| 2 | A | 400 |
| 1 | B | 500 |
| 2 | B | 350 |
| 1 | C | 230 |
| 2 | C | 120 |
列id和类有一个我想利用的唯一复合索引。现在我有了这个id类对的列表,我必须从这个表中获得:
(1, A)
(2, B)
我需要选择它们以将两行的值更新为任意值。比如说1000
我的问题是,如何在利用复合索引的同时选择这两行
我试过这个:
SELECT
*
FROM
table
WHERE
id IN (1, 2)
AND class IN ('A','B')
但这让我得到了组合:
| id | class |
| 1 | A |
| 1 | B |
| 2 | A |
| 2 | B |
我只想:
| id | class |
| 1 | A |
| 2 | B |
这将有助于:
SELECT
*
FROM
test
WHERE
CAST(id as varchar)+class IN ('1A', '2B')
但这打破了指数。是否有一种方法可以在利用索引的同时获取所需内容?您可以使用OR运算符,请参阅:
SELECT * FROM table WHERE (id = 1 AND class = 'A') OR (id = 2 AND class = 'B')
您可以使用OR运算符,请参见:
SELECT * FROM table WHERE (id = 1 AND class = 'A') OR (id = 2 AND class = 'B')
以下脚本将利用复合索引:
SELECT
*
FROM [table] T
INNER JOIN (
SELECT
1 AS ID
,'A' AS CLASS
UNION
SELECT
2 AS ID
,'B' AS CLASS
) t2
ON T.Id = t2.Id
AND T.class = t2.class
或者这个:
SELECT
*
FROM [table] T
WHERE (Id = 1 AND class = 'A')
OR (Id = 2 AND class = 'B')
WITH CTE AS(
SELECT 1 AS ID, 'A' AS CLASS UNION
SELECT 2 AS Id, 'B' AS CLASS
)
SELECT
*
FROM [table] T
WHERE EXISTS (
SELECT 1
FROM CTE t2
WHERE T.Id = t2.Id
AND T.class = t2.class
)
或者这个:
SELECT
*
FROM [table] T
WHERE (Id = 1 AND class = 'A')
OR (Id = 2 AND class = 'B')
WITH CTE AS(
SELECT 1 AS ID, 'A' AS CLASS UNION
SELECT 2 AS Id, 'B' AS CLASS
)
SELECT
*
FROM [table] T
WHERE EXISTS (
SELECT 1
FROM CTE t2
WHERE T.Id = t2.Id
AND T.class = t2.class
)
以下脚本将利用复合索引:
SELECT
*
FROM [table] T
INNER JOIN (
SELECT
1 AS ID
,'A' AS CLASS
UNION
SELECT
2 AS ID
,'B' AS CLASS
) t2
ON T.Id = t2.Id
AND T.class = t2.class
或者这个:
SELECT
*
FROM [table] T
WHERE (Id = 1 AND class = 'A')
OR (Id = 2 AND class = 'B')
WITH CTE AS(
SELECT 1 AS ID, 'A' AS CLASS UNION
SELECT 2 AS Id, 'B' AS CLASS
)
SELECT
*
FROM [table] T
WHERE EXISTS (
SELECT 1
FROM CTE t2
WHERE T.Id = t2.Id
AND T.class = t2.class
)
或者这个:
SELECT
*
FROM [table] T
WHERE (Id = 1 AND class = 'A')
OR (Id = 2 AND class = 'B')
WITH CTE AS(
SELECT 1 AS ID, 'A' AS CLASS UNION
SELECT 2 AS Id, 'B' AS CLASS
)
SELECT
*
FROM [table] T
WHERE EXISTS (
SELECT 1
FROM CTE t2
WHERE T.Id = t2.Id
AND T.class = t2.class
)