Фильтрация в SQL Query с помощью Join Query - PullRequest
0 голосов
/ 03 июня 2011

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

В ComplexQuery есть несколько столбцов, и наиболее заметными именами столбцов являются WeightCode и DrugName.

[Предположение]: Select * from ComplexQuery.

У меня есть вторая таблица: Select DrugName from Table2.

Мое требование таково, что

Если WeightCode = 2, то сначалаПять букв DrugName из ComplexQuery, совпадающих с первыми пятью буквами DrugName из Таблицы 2, должны быть удалены.

Я не совсем понимаю, приближаясь ...!Как мне определить в одном запросе соединения с условием фильтрации ??

Ответы [ 4 ]

2 голосов
/ 03 июня 2011

Использование Case..When может решить вашу проблему

Пример

SELECT column1, column2
FROM TABLE
WHERE
column1 = 
  CASE @locationType
      WHEN 'val1' THEN column1
      WHEN 'val2' THEN column1 
  END

Примечание: это просто пример

0 голосов
/ 03 июня 2011

Используйте 2 запроса и Объедините все результаты вместе.

В первом запросе получите данные, где WeightCode = 2. Выполните объединение и подстроки, чтобы получить нужные вам результаты.

Второй запрос получает данные, где WeightCode! = 2. Возвращает одинаковые имена и типы полей в одинаковом порядке.

Поместите все объединения между ними, чтобы объединить результаты в один набор результатов..

0 голосов
/ 03 июня 2011

Итак, , если ComplexQuery.WeightCode = 2, и , если , первые пять букв WeightCode.DrugName можно сопоставить первым пяти буквам любой записи из Table2.DrugNameВы хотите удалить первые пять букв из ComplexQuery.WeightCode?

Если это так, попробуйте это:

SELECT cq.*, 
    CASE cq.WeightCode WHEN 2 THEN RIGHT(cq.DrugName, LEN(cq.DrugName)-5) ELSE cq.DrugName END DrugName
FROM ComplexQuery cq
    LEFT OUTER JOIN Table2 t 
        ON cq.WeightCode = 2 AND LEFT(cq.DrugName, 5) = LEFT(t2.DrugName, 5)
0 голосов
/ 03 июня 2011

Вы также можете использовать подвыбор с NOT IN или EXISTS.

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

И.Е.

WHERE MainTableKey NOT IN (SELECT ForeignKey from MyTable2
                           WHERE DoNotInclude = 1)

EDIT:

Альтернативный раствор, используйте EXCEPT

Псевдокод будет:

SELECT col1, col2, col3
FROM ComplexQuery
EXCEPT
SELECT Col1, Col2, Col3
FROM MyTable t1
INNER JOIN Table2 t2
   ON LEFT(t1.Drugname, 5) = LEFT(t2.drugname, 5)
   AND t1.WeightCode = 2

За исключением удаления второго набора результатов из первого набора результатов. Единственный улов - вам нужно вернуть одинаковые поля в обоих наборах, как в UNION.

...