Левое соединение возвращает одно значение для всего столбца - PullRequest
0 голосов
/ 04 ноября 2019

Я выполняю левое соединение с другой таблицей в подзапросе, и столбец комиссионных, который я хочу вернуть из левого соединения, приносит только одно значение для всего столбца комиссионных, что неверно (см. Первый результат запроса ниже). Теперь, если я выполню левое соединение вне таблицы A (запрос 2), я получу желаемые результаты (см. Второй набор результатов). Вопрос в том, почему левое соединение не работает в таблице A в первом запросе.

Я пробовал левое соединение вне подзапроса / таблицы A (запрос 2), и оно работает нормально, но я хочу узнатьпочему левое соединение не работает в таблице A.

Ниже приведен запрос (запрос 1), в котором указаны повторяющиеся значения в столбце комиссии

Position_A1 table

Sector      Short_Side
------------------------
Engineering  -2
Financial    -5
Industry     -10
Corporate    -36    
Energy       -52
Financial    -26

Order table

Sector      Commission
------------------------
Engineering  10
Financial    100
Industry     36
Corporate    91 
Energy       10
Financial   25

Запрос 1

SELECT *   
FROM
(SELECT POS.SECTOR, 
  SUM(ABS(POS.SHORT_SIDE)) AS Short_Expo,       
  COM.COMMISSION
FROM Position_A1 POS

LEFT JOIN (SELECT SECTOR, sum(COMMISSION) AS COMMISSION
            FROM ORDER
            WHERE TRADE_DATE = TO_DATE('2019-11-01','YYYY-MM-DD')
            GROUP BY SECTOR 
            )COM
            ON POS.SECTOR = COM.SECTOR 

WHERE TRADE_DATE = TO_DATE('2019-11-01','YYYY-MM-DD')
GROUP BY SECTOR ) A

Однако, если я попробую следующее, я получу правильные результаты в столбце комиссии.

Запрос 2

SELECT A.*, COM.COMMISSION   
FROM
(SELECT POS.SECTOR, 
  SUM(ABS(POS.SHORT_SIDE)) AS Short_Expo       
FROM Position_A1 POS

WHERE TRADE_DATE = TO_DATE('2019-11-01','YYYY-MM-DD')
GROUP BY SECTOR ) A

LEFT JOIN (SELECT SECTOR, sum(COMMISSION) AS COMMISSION
            FROM ORDER
            WHERE TRADE_DATE = TO_DATE('2019-11-01','YYYY-MM-DD')
            GROUP BY SECTOR 
            )COM
            ON POS.SECTOR = COM.SECTOR 

Согласно первому запросу результат Iget is:

Sector      Short_Expo      Commission
Energy      256             125
Industry    236             125
Financial   125             125

В соответствии со вторым запросом результат, который я получаю (это правильно):

Sector      Short_Expo      Commission
Energy      256             128
Industry    236             325
Financial   125             186

Вопрос в том, почему запрос один не дает идеальный результаттогда как запрос 2. Что я делаю неправильно в первом запросе, который приводит к дублированию комиссии?

При использовании первого кажется, что комиссия только для одного сектора (Финансовый) возвращается для всех секторов.

1 Ответ

0 голосов
/ 04 ноября 2019

В первом запросе предложение WHERE во внешнем запросе (WHERE TRADE_DATE = TO_DATE('2019-11-01', 'YYYY-MM-DD')) превращает LEFT JOIN в INNER JOIN, поскольку несоответствующие значения равны NULL, и они не совпадают.

Обычное решение - включить фильтрацию для последующих таблиц в предложение ON.

...