Возможно ли иметь разные условия для каждой строки в запросе? - PullRequest
1 голос
/ 24 ноября 2011

Как я могу выбрать набор строк, где каждая строка соответствует определенному условию?

Пример:

Предположим, у меня есть таблица со столбцом с именем name, я хочу получить результат ТОЛЬКО ЕСЛИ имя первой строки соответствует 'A', имя второй строки соответствует 'B', а имя третьей строки соответствует 'C'.

Edit:

Я хочу сделать это, чтобы работать без фиксированного размера, но таким образом я могу определить последовательность, такую ​​как R, X, V, P, T, и она соответствует последовательности, каждый подряд, но по порядку.

Ответы [ 4 ]

2 голосов
/ 24 ноября 2011

вы можете, но, вероятно, не так, как вам хотелось бы:

если ваша таблица имеет числовое поле id, которое увеличивается с каждой строкой, вы можете самостоятельно присоединиться к этой таблице 3 раза (скажем"a", "b" и "c") и используйте условие соединения a.id + 1 = b.id и b.id + 1 = c.id и поместите фильтр в предложение where, например: a.name ='A' AND b.name = 'B' AND c.name = 'C'

, но не ожидайте производительности ...

1 голос
/ 24 ноября 2011

Предполагая, что Вы знаете, как предоставить номер строки своим строкам (например, ROW_NUMBER () в SQL Server), Вы можете создать таблицу поиска (соответствия) и присоединиться к ней. См. Объяснение ниже:

LookupTable:

RowNum    Value
1         A
2         B
3         C

Ваша исходная таблица SourceTable (при условии, что вы уже добавили в нее RowNum - на случай, если вы этого не сделали, просто введите для нее подзапрос (или CTE для SQL Server 2005 или новее):

RowNum Name
-----------
1      A
2      B
3      C
4      D

Теперь вам нужно внутреннее соединение LookupTable с вашей SourceTable на LookupTable.RowNum = SourceTable.RowNum AND LookupTable.Name = SourceTable.Name. Затем выполните левое объединение этого результата с LookupTable только для RowNum. Если в конечном результате LookupTable.RowNum IS NULL, то Вы знаете, что не найдено ни одного полного совпадения хотя бы в одной строке.

Вот код для объединения:

SELECT T.*, LT2.RowNum AS Matched 
FROM LookupTable LT2
LEFT JOIN 
(
    SELECT ST.*
    FROM SourceTable ST
    INNER JOIN LookupTable LT ON LT.RowNum = ST.RowNum AND LT.Name = ST.Name
) T
    ON LT2.RowNum = T.RowNum

Набор результатов вышеупомянутого запроса будет содержать строки с Matched IS NULL, если строка не соответствует условию из таблицы LookupTable.

0 голосов
/ 24 ноября 2011

Это может быть близко к тому, что вы после ... но мне нужно знать, где вы получаете ваши значения для A, B, C и т.д ...

Select [insert your fields here]
FROM
(Select T1.Name, T1.Age, RowNum as t1RowNum from T T1 order by name) T1O
Full Outer JOIN 
(Select T2.Name, T2.Age, RowNum as T2rowNum From T T2 order By name) T2O
ON T1O.T1RowNum+1 = T2O.T2RowNum
0 голосов
/ 24 ноября 2011

Полагаю, вы могли бы выполнить подзапрос для каждой строки, но он не будет работать хорошо или масштабироваться вообще, и его будет сложно поддерживать.

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