如何在SQL Server中搜索/选择复合索引值列表并获得精确匹配的行?

如何在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)

我有一个值对列表,必须在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)
(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
        )