2010-02-13 7 views
1

Какой из следующих запросов правильныВ статье на нескольких столбцах с помощью AND, РЕГИСТРИРУЙТЕСЬ

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' 

ответ

0

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

+0

то, что я слышал, если UNION будет возвращать различные строки и UNIONALL возвращает экспоненциальным взрыв, пожалуйста, исправьте меня, если я ошибаюсь – Subbu

+0

Вы не делаете СОЮЗ, вы делаете ПРИСОЕДИНЕНИЕ. –

+0

Я сожалею по поводу второго запроса, поэтому, если я использую союз, я должен получить ожидаемые результаты ВЫБРАТЬ ID, STATUS, ITEM_TYPE, CREATED_TIME, UPDATED_TIME ГДЕ STATUS IN ('Open', 'ОБНОВЛЕНО') UNION ВЫБОР ID, STATUS, ITEM_TYPE, CREATED_TIME, UPDATED_TIME ГДЕ ITEM_TYPE В ('ITEM1', 'ITEM2') СОЕДИНЕНИЕ ВЫБОР ID, СТАТУС, ITEM_TYPE, CREATED_TIME, UPDATED_TIME ГДЕ CREATED_TIME МЕЖДУ 'XX' И 'YY' UNION ВЫБРАТЬ ID, STATUS, item_type, CREATED_TIME, UPDATED_TIME ГДЕ UPDATED_TIME МЕЖДУ 'XX' И 'ZZ' – Subbu

0

Первый запрос правильный, второй даст, хорошо .... a 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

Спасибо за ответ, но проблема, с которой я сталкиваюсь, - это если какое-либо условие не выполняется, запрос не возвращает никаких значений. например, если нет соответствующих строк для updated_time, строки не возвращаются, даже все остальные условия соответствуют – Subbu

+1

В этом случае используйте ИЛИ не И – SQLMenace

0

первые

JOINS должен быть перед ИНЕК

хотя вы могли бы переписать JOINS с EXISTS, а затем вырезать положить его в ИНЕКЕ

+0

, можете ли вы привести пример – Subbu