Текущий сценарий: У меня есть этот запрос, который объединяет все два набора данных, а затем выбирает поля на основе ранга. Но согласно моему анализу весь набор данных может быть удален с одной стороны UNION.
Анализ: Итак, если вы посмотрите на приведенный ниже запрос, я думаю, что мы можем полностью игнорировать и удалить набор данных, созданный объединением таблиц: P, Q, R, S и T.
также могу ли я заменить unionall на union здесь
Запрос:
SELECT OUTERV.f1, ... OUTERV.f30
FROM
(
SELECT
unionV.f1, ...unionV.f30, ROW_NUMBER() over (PARTITION BY unionV.ifc order by unionV.orderNUM_ asc) rank_
FROM
(
SELECT f1 .. few fields, 1 as ORDERNUM_
FROM
A
JOIN B on A.id = B.id
JOIN ( SELECT few remaining fields FROM C )
C ON C.id = B.id
JOIN D ON C.id = D.id
JOIN E ON E.id = D.id
JOIN F on F.id = E.id
UNION ALL
SELECT
f1, f2, ...f30 , 2 as ORDERNUM_
FROM
P
JOIN Q ON P.id = Q.id
JOIN R ON Q.id = R.id
JOIN S on S.id = R.id
JOIN T on S.id = T.id
)unionV
)
OUTERV where
OUTERV.rank_ = 1
Запрос: Пожалуйста, подтвердите правильность моего анализа.


Я не согласен с Анализом; он делает предположения, которые могут быть неверными. Однако если вы можете гарантировать, что все значения IFC во второй части объединения существуют в первой части объединения, и это ВСЕГДА так, то ваш анализ верен.
Essentially what the query you have does is trust the data from the first set of the union more than the second set of the union. However, if there is an IFC value in the second set not in the first; it must come from the 2nd part of the union; thus removing the second part of the union could remove records.
Пример:
A и P на каждой стороне соединения.A и P.
A.ifc
A
B
P.ifc
A
Z
В вашем текущем запросе результаты будут
A (from A table)
B (from A table)
Z (from P Table)
Если вы исключите 2-ю часть объединения, вы удалите P, и поэтому Z будет исключен из результатов; следовательно, они не равны, и вы не можете удалить вторую часть союза.
Теперь, если все ifc, определенные во втором наборе, содержатся в первом наборе, определенном объединениями, и это ВСЕГДА верно; тогда да, вы могли бы исключить 2-ю часть союза. Так как первый набор содержит в первую очередь полный комплект. Однако, если это не гарантированно верное утверждение, то текущий подход, использующий объединение на... F и P... T, генерирует "главный набор"
Союз все в порядке. Union устранит только дубликаты, существующие в каждом наборе. но моя точка зрения была больше связана с потерей записей из второго набора данных, определенного объединением, если не из первого набора, определенного объединением.
да, . я также начну смотреть на данные параллельно. спасибо за пример, очень помогло.
Да . Теперь я понял, что вы говорите. большое, большое спасибо за ваше подробное объяснение. В этом случае UNION также продлит время выполнения, union-all имеет больше смысла. этот запрос теперь выглядит в значительной степени настроенным, и нет места для оптимизации.