Многократное соединение eSQL, но с условиями - PullRequest
0 голосов
/ 30 сентября 2019

У меня 3 таблицы как под

MERCHANDISE

+-----------+-----------+---------------+
| MERCH_NUM | MERCH_DIV | MERCH_SUB_DIV |
+-----------+-----------+---------------+
|         1 | car       | awd           |
|         1 | car       | awd           |
|         2 | bike      | 1kcc          |
|         3 | cycle     | hybrid        |
|         3 | cycle     | city          |
|         4 | moped     | fixie         |
+-----------+-----------+---------------+

PRIORITY

+----------+-----------+---------+---------+------------+------------+---------------+
| CUST_NUM | SALES_NUM | DOC_NUM | BALANCE | PRIORITY_1 | PRIORITY_2 | PRIORITY_CODE |
+----------+-----------+---------+---------+------------+------------+---------------+
|       90 |      1000 |      10 |      23 |          1 |          6 | NO            |
|       91 |      1001 |      20 |      32 |          3 |          7 | PRI           |
|       92 |      1002 |      30 |      11 |          2 |          8 | LATE          |
|       93 |      1003 |      40 |      22 |          5 |          9 | 1MON          |
+----------+-----------+---------+---------+------------+------------+---------------+

ЗАКАЗАТЬ

+----------+-----------+---------+---------+-----------+-----------+
| CUST_NUM | SALES_NUM | DOC_NUM | COUNTRY | MERCH_NUM | MERCH_DIV |
+----------+-----------+---------+---------+-----------+-----------+
|       90 |      1000 |      10 | INDIA   |         1 | car       |
|       91 |      1001 |      20 | CHINA   |         2 | bike      |
|       92 |      1002 |      30 | USA     |         3 | cycle     |
|       93 |      1003 |      40 | UK      |         4 | moped     |
+----------+-----------+---------+---------+-----------+-----------+

Я хочу присоединитьсялевая объединенная таблица из двух последних таблиц с первой, так что MERCH_SUB_DIV 'awd' появляется только один раз для каждой уникальной комбинации merch_num и merch_div

код, который я придумал,как под, но я не уверен, как мне удалить дублирующую строку только для awd

select 
  ROW#, MERCH.MERCH_NUMBER, ORDPRI.MERCH_NUMBER, ORDPRI.CUST_NUM, 
  BALANCE, SALES_NUM, ITEM_NUM, RANK, PRIORITY_1
from (
  select 
    ROW_NUMBER() OVER(
      PARTITION BY ORD.DOC_NUM, ORD.ITEM_NUM 
      ORDER BY ORD.DOC_NUM, ORD.ITEM_NUM ASC
    ) AS Row#,
    ORD.CUST_NUM, PRI.CUST_NUM, ORD.MERCH_NUM, ORD.MERCH_DIV, PRI.BALANCE,
    pri.DOC_NUM, pri.SALES_NUM, pri.PRIORITY_1, pri.PRIORITY_2 
  from ORDER as ORD 
  left join PRIORITY as PRI on ORD.DOC_NUM = PRI.DOC_NUM 
    and ORD.SALES_NUMBER = PRI.SALES_NUM
  where country_name in ('USA', ‘INDIA’)
) as ORDPRI 
left join MERCHANDISE as MERCH on ORDPRI.DIV = MERCH.DIV 
  and ORDPRI.MERCH_NUM = MERCH.MERCH_NUM

Ответы [ 2 ]

0 голосов
/ 30 сентября 2019

Обходным путем может быть добавление одного нового Row_Number() во внешний запрос, имеющий Partition by MERCH_SUB_DIV + all the columns in the final list, а затем фильтрация окончательных результатов на основе New Row_Number(). Следует псевдокод, который может помочь:

select 
  -- All expected columns in final result except the newRow#
  ROW#, MERCH_NUM, CUST_NUM, 
  BALANCE, SALES_NUM, PRIORITY_1
  from (
select 
  ROW#,
  -- the new row number includes all column you want to show in final result
  row_number() over ( PARTITION BY MERCH.MERCH_SUB_DIV , 
                      MERCH.MERCH_NUM, ORDPRI.MERCH_NUM, ORDPRI.CUST_NUM, 
                      BALANCE, SALES_NUM, PRIORITY_1  
                      order by (select 1 )) as newRow# ,
  MERCH.MERCH_NUM, ORDPRI.CUST_NUM, 
  BALANCE, SALES_NUM, PRIORITY_1
 from (
      -- main query goes here
      select 
      ROW_NUMBER() OVER(
      PARTITION BY ORD.DOC_NUM --, ORD.ITEM_NUM 
      ORDER BY ORD.DOC_NUM ASC --, ORD.ITEM_NUM 
    ) AS Row#,
    ORD.CUST_NUM, ORD.MERCH_NUM, ORD.MERCH_DIV as DIV, PRI.BALANCE,
    pri.DOC_NUM, pri.SALES_NUM, pri.PRIORITY_1, pri.PRIORITY_2 
  from @ORDER as ORD 
  left join @PRIORITY as PRI on ORD.DOC_NUM = PRI.DOC_NUM 
  and ORD.SALES_NUMBER = PRI.SALES_NUM
  where country_name in ('USA', 'INDIA')
  ) as ORDPRI 
left join @MERCHANDISE as MERCH on ORDPRI.DIV = MERCH.DIV 
  and ORDPRI.MERCH_NUM = MERCH.MERCH_NUM
) as T
-- final filter to get distinct values
where newRow# = 1

Пример кода здесь .. Надеюсь, это поможет !!

0 голосов
/ 30 сентября 2019

Вы должны использовать ключевое слово «DISTINCT», чтобы получить уникальные значения, но если ваша «Таблица приоритетов» и «Таблица заказов» содержат разные значения для того же MERCH_NUM, то в конечном результате содержится повторение «MERCH_NUM».

SELECT DISTINCT M.MERCH_NUMBER, O.MERCH_NUMBER, O.CUST_NUM, BALANCE, SALES_NUM,ITEM_NUM,RANK,PRIORITY_1
FROM priority_table P
LEFT JOIN order_table O ON P.CUST_NUM = O.CUST_NUM AND P.SALES_NUM=O.SALES_NUM AND P.DOC_NUM = O.DOC_NUM
LEFT JOIN merchandise_table M ON M.MERCH_NUM = O.MERCH_NUM
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...