kurkuma
13.03.2013 10:06 Gajim
Блджад. Есть 2 запроса в оракле, которые, по идее, аналогичные, но написанные двумя разными способами.
Для проверки аналогичности решил потыкать. count(*) в одном случае выдает 138 тысяч результатов, во втором 300 тысяч. То есть, по идее, они нихуя не аналогичные. Но вот если взять один запрос, потом MINUS второй запрос (столбцы одинаковые), то результат 0 строк. Второй MINUS первый тоже 0 строк.
В чем подъеб? Суть: первый запрос сделан через PARTITION BY, второй через GROUP. Примерные запросы:
SELECT u.id, max(p.time) OVER (PARTITION BY p.id) as last
FROM users u LEFT JOIN posts p ON p.user = u.id
WHERE p.type > 0
Второй:
SELECT u.id, max(p.time) as last
FROM users u LEFT JOIN posts p ON p.user = u.id
WHERE p.type > 0
GROUP BY u.id
left join
count будет считать все из users удовлетворяющее, даже если его нет в posts
хотя забей я хуету спорол.
действительно
всмысле, хуйню спорол
>MINUS
URGHAY
чо
Ебать я дерево да
Ну все таки разве каунт не будет хуево щитать?
будет, конечно. только он как-то наоборот хуево считает. в случае с PARTITION BY он должен вернуть больше строк чем от GROUP BY, потому что партишн не склеивает строки, то есть, получается куча дублей.
Если у тебя есть 3 строки с одинаковым значением поля по которому ты группируешь, то в случае GROUP'а у тебя на выходе будет 1 строка, а в случае партишна — 3 одинаковых строки
так у тебя груп возвращает больше?
действительно, должен больше возвращать партишон
груп роллит строки жи
есть варик полностью поглядеть запросы, или смысла в этом нет?
да похуй уже, забей. после того как мне пришло чуть больше тыщи копий одной строки, я все таки решил юзать гроуп