Предложение IN для нескольких столбцов с использованием AND, JOIN - PullRequest
1 голос
/ 13 февраля 2010

Какие из следующих запросов верны

SELECT
 ID, STATUS, ITEM_TYPE,CREATED_TIME,UPDATED_TIME
WHERE
 STATUS IN('OPEN','UPDATED')
AND
 ITEM_TYPE IN ('ITEM1','ITEM2')
AND
 CREATED_TIME BETWEEN 'XX' AND 'YY'
AND
 UPDATED_TIME BETWEEN 'XX' AND 'ZZ'

 SELECT
         ID, STATUS, ITEM_TYPE,CREATED_TIME,UPDATED_TIME
 WHERE
         STATUS IN('OPEN','UPDATED')
 JOIN

 SELECT
         ID, STATUS, ITEM_TYPE,CREATED_TIME,UPDATED_TIME
 WHERE
         ITEM_TYPE IN ('ITEM1','ITEM2')
 JOIN

 SELECT
         ID, STATUS, ITEM_TYPE,CREATED_TIME,UPDATED_TIME
 WHERE
         CREATED_TIME BETWEEN 'XX' AND 'YY'
 JOIN

 SELECT
         ID, STATUS, ITEM_TYPE,CREATED_TIME,UPDATED_TIME
 WHERE
         UPDATED_TIME BETWEEN 'XX' AND 'ZZ'

Ответы [ 3 ]

0 голосов
/ 13 февраля 2010

Первый запрос верен, второй даст, ну .... а LOT результатов.

В ответ на ваш комментарий, как указано SQLMenace , вместо этого используйте ИЛИ, если хотите соответствовать любому из условий:

SELECT ID, STATUS, ITEM_TYPE,CREATED_TIME,UPDATED_TIME
WHERE STATUS IN('OPEN','UPDATED')
   OR ITEM_TYPE IN ('ITEM1','ITEM2')
   OR CREATED_TIME BETWEEN 'XX' AND 'YY'
   OR UPDATED_TIME BETWEEN 'XX' AND 'ZZ'

Или, если вы хотите всегда ограничить по времени, но выполнить или из первых условий, тогда используйте завернутый ИЛИ:

SELECT ID, STATUS, ITEM_TYPE,CREATED_TIME,UPDATED_TIME
WHERE (STATUS IN('OPEN','UPDATED') OR ITEM_TYPE IN ('ITEM1','ITEM2'))
  AND CREATED_TIME BETWEEN 'XX' AND 'YY'
  AND UPDATED_TIME BETWEEN 'XX' AND 'ZZ'
0 голосов
/ 13 февраля 2010

первый

СОЕДИНЕНИЯ должны быть перед предложением WHERE

хотя вы можете переписать СОЕДИНЕНИЯ с помощью EXISTS, а затем вырезать, поместив его в предложение WHERE

0 голосов
/ 13 февраля 2010

Первое верно, если вы не хотите экспоненциального взрыва самосоединений.

...