I have a list of value pairs that I have to search in a table in SQL Server. the table is something like this:
x
| id | class | value |
| 1 | A | 300 |
| 2 | A | 400 |
| 1 | B | 500 |
| 2 | B | 350 |
| 1 | C | 230 |
| 2 | C | 120 |
The columns id and class have an unique composite index that I want to take advantage of. Now I have this list of id-class pairs that I have to get from this table:
(1, A)
(2, B)
I need to select them to UPDATE the value of both rows to any value. Let’s say 1000.
My problem is, how do I select those two rows while taking advantage of the composite index?
I have tried this:
SELECT
*
FROM
table
WHERE
id IN (1, 2)
AND class IN ('A','B')
But this returns me the combinations:
| id | class |
| 1 | A |
| 1 | B |
| 2 | A |
| 2 | B |
and I just want:
| id | class |
| 1 | A |
| 2 | B |
this would work:
SELECT
*
FROM
test
WHERE
CAST(id as varchar)+class IN ('1A', '2B')
but this breaks the index. Is there a way to get what I need while taking advantage of the index?
Advertisement
Answer
The follow scripts will take advantage of composite index:
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
or this:
SELECT
*
FROM [table] T
WHERE (Id = 1 AND class = 'A')
OR (Id = 2 AND class = 'B')
or this:
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
)