Извлечение SQL из таблиц - PullRequest
0 голосов
/ 22 июля 2011

У меня есть таблица что-то вроде

EMPLOYEE_ID DTL_ID COLUMN_A COLUMN_B
---------------------------
JOHN        0       1           1
JOHN        1       3           1
LINN        0       1           12
SMITH       0       9           1
SMITH       1       11          12

Это означает, что для каждого человека будет одна или несколько записей с различными значениями DTL_ID (0, 1, 2 и т. Д.).

Теперь я хотел бы создать инструкцию T-SQL для извлечения записей с EMPLOYEE_ID и DTL_ID.

Если указанный DTL_ID НЕ найден, будет возвращена запись с DTL_ID=0.

Я знаю, что могу достичь этого различными способами, например, проверить, существует ли строка сначала через EXISTS или COUNT(*), а затем получить строку.

Однако я хотел бы знать другие возможные способы, потому что этот оператор поиска очень распространен в моем приложении, и в моей таблице сотни тысяч строк.

В вышеупомянутом подходе мне пришлось извлекать дважды, даже если существует запись с указанным DTL_ID, и я хочу избежать этого.

Ответы [ 6 ]

2 голосов
/ 22 июля 2011

Если DTL_ID всегда равен 0 или положителен:

SELECT TOP 1 * FROM table
where EmployeeID = @EmployeeID and DTL_ID in (@DTL_ID,0)
order by DTL_ID desc

Если вы работаете с несколькими сотрудниками в одном запросе и т. Д., Вы можете использовать ROW_NUMBER (), если ваша версия SQL поддерживает это.

2 голосов
/ 22 июля 2011

Примерно так:

  SELECT *
    FROM table
   WHERE EMPLOYEE_ID = ?? AND DTL_ID = ??
UNION
  SELECT *
    FROM table
   WHERE EMPLOYEE_ID = ?? AND DTL_ID = 0
     AND NOT EXISTS (SELECT *
                       FROM table
                      WHERE EMPLOYEE_ID = ?? AND DTL_ID = ??)

Вам, конечно, придется заполнить ??с правильным номером.

0 голосов
/ 22 июля 2011

Вы можете использовать top и union, например:

declare @t table(id int, value int, c char)
insert @t values (1,0,'a'), (1,1,'b'), (1,2,'c')

declare @id int = 1;
declare @value int = 2;

select top(1) *
from
(
    select *
    from @t t
    where t.value =  @value and t.id = @id

    union all

    select *
    from @t t
    where t.value = 0

)a
order by a.value desc

Если @value = 2, то запрос возвращает 1 2 c.Если @value = 3, то запрос возвращает 1 0 a.

0 голосов
/ 22 июля 2011
SELECT MAX(DTL_ID) ...
WHERE DTL_ID IN (@DTL_ID, 0)
0 голосов
/ 22 июля 2011
SELECT E1.EMPLOYEE_ID, ISNULL(E2.DTL_ID, 0), E1.COLUMN_A, E1.COLUMN_B EMPLIYEES AS E1
LEFT JOIN EMPLIYEES AS E2
ON E1.EMPLOYEE_ID = E2.EMPLOYEE_ID AND E2.DTL_ID = 42
0 голосов
/ 22 июля 2011

Используйте ISNULL(DTL_ID, 0) в вашем окончательном SELECT запросе

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...