Как искать / выбирать список значений составного индекса и получать точно совпадающие строки в SQL Server? - PullRequest
1 голос
/ 27 июня 2019

У меня есть список пар значений, которые мне нужно искать в таблице в SQL Server.таблица выглядит примерно так:

| id | class | value |
| 1  | A     | 300   |
| 2  | A     | 400   |
| 1  | B     | 500   |
| 2  | B     | 350   |
| 1  | C     | 230   |
| 2  | C     | 120   |

Столбцы id и class имеют уникальный составной индекс, которым я хочу воспользоваться.Теперь у меня есть список пар 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') 

, но это нарушает индекс.Есть ли способ получить то, что мне нужно, пользуясь индексом?

Ответы [ 2 ]

0 голосов
/ 27 июня 2019

Следующие сценарии используют преимущества составного индекса:

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
        ) 
0 голосов
/ 27 июня 2019

Вы можете использовать оператор ИЛИ, см .:

SELECT * FROM table WHERE (id = 1 AND class = 'A') OR (id = 2 AND class = 'B')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...