SQL несколько, где условия не работают
У меня есть эти 3 запроса, которые почти одинаковы, за исключением оператора where:
Insert into t1(f1,f2,f3)
SELECT t2.f1 AS f1, '' AS f2, t2.f2 AS f2, t3.f3 AS f3)
from t2
INNER JOIN t3 ON t2.f1 = t3.f1
WHERE (t2.f4 = 'n') and t2.f5 < '2013-04-01' and t2.f6 in('sss','ttt','ddd')
GROUP BY t2.f4, t2.f5, t2.f6;
Insert into t1(f1,f2,f3)
SELECT t2.f1 AS f1, '' AS f2, t2.f2 AS f2, t3.f3 AS f3)
from t2
INNER JOIN t3 ON t2.f1 = t3.f1
WHERE (t2.f4 = 'n') and t2.f5 > '2013-03-31' and t2.f6 in('sss','ttt','ddd')
GROUP BY t2.f4, t2.f5, t2.f6;
Insert into t1(f1,f2,f3)
SELECT t2.f1 AS f1, '' AS f2, t2.f2 AS f2, t3.f3 AS f3)
from t2
INNER JOIN t3 ON t2.f1 = t3.f1
WHERE (t2.f4 = 'n') and t2.f6 in('rrr','qqq','yyy')
GROUP BY t2.f4, t2.f5, t2.f6;
я не могу объединить их, как в следующем запросе, и они будут теоретически один и тот же запрос? Потому что я попробовал именно это, и я получаю разные результаты при тестировании результатов.
Insert into t1(f1,f2,f3)
SELECT t2.f1 AS f1, '' AS f2, t2.f2 AS f2, t3.f3 AS f3)
from t2
INNER JOIN t3 ON t2.f1 = t3.f1
WHERE (t2.f4 = 'n') and (t2.f5 < '2013-04-01' or t2.f5 > '2013-03-31' and t2.f6 in
('sss','ttt','ddd')) or t2.f6 in ('rrr','ggg','yyy')
GROUP BY t2.f4, t2.f5, t2.f6;
Я также попробовал это, и оно тоже не соответствовало (я в значительной степени просто охватил все предыдущие, где в круглых скобках были отмечены операторы, и добавил или в комбинированном выражении):
Insert into t1(f1,f2,f3)
SELECT t2.f1 AS f1, '' AS f2, t2.f2 AS f2, t3.f3 AS f3)
from t2
INNER JOIN t3 ON t2.f1 = t3.f1
WHERE ((t2.f4 = 'n') and t2.f5 < '2013-04-01' and t2.f6 in('sss','ttt','ddd')) or
((t2.f4 = 'n') and t2.f5 > '2013-03-31' and t2.f6 in('sss','ttt','ddd')) or ((t2.f4 = 'n') and t2.f6 in('rrr','qqq','yyy'))
2 ответа
Это не один и тот же запрос, поскольку AND имеет приоритет над OR.
Итак, в вашей первой попытке переписать, у вас есть:
(t2.f4 = 'n')
and (t2.f5 < '2013-04-01' or t2.f5 > '2013-03-31' and t2.f6 in ('sss','ttt','ddd'))
or t2.f6 in ('rrr','ggg','yyy')
Все, что удовлетворяет третьей строке, удовлетворяет всему предложению where.
Другими словами, вам нужны круглые скобки вокруг первых двух строк:
((t2.f4 = 'n')
and (t2.f5 < '2013-04-01' or t2.f5 > '2013-03-31' and t2.f6 in ('sss','ttt','ddd')))
or t2.f6 in ('rrr','ggg','yyy')
Это может быть полезно: Приоритет оператора логики SQL: и и или
Разве это не работает?
Insert into t1(f1,f2,f3)
SELECT t2.f1 AS f1, '' AS f2, t2.f2 AS f2, t3.f3 AS f3)
from t2
INNER JOIN t3 ON t2.f1 = t3.f1
WHERE ((t2.f4 = 'n') and t2.f5 > '2013-03-31' and t2.f6 in('sss','ttt','ddd'))
OR ((t2.f4 = 'n') and t2.f5 < '2013-04-01' and t2.f6 in('sss','ttt','ddd'))
OR ((t2.f4 = 'n') and t2.f6 in('rrr','qqq','yyy'))
GROUP BY t2.f4, t2.f5, t2.f6;