Устранить дубликаты записей в столбце на JOIN - PullRequest
0 голосов
/ 22 октября 2018

Пример исходных данных:

  Table 1                                             Table 2
|  ID   |   Name   |  Cost   |  Cost2  |           |  ID   |   Info1   |   Info2   |
|-------|----------|---------|---------|           |-------|-----------|-----------|
|  1    |   Name1  |   20    |   50    |           |  1    |   text1   |   text1   |
|  2    |   Name2  |   30    |   10    |           |  1    |   text1   |   text1   |
|  2    |   Name22 |   30    |   40    |           |  1    |   text1   |   text1   |
|  3    |   Name3  |   20    |   50    |           |  2    |   text21  |   text21  |
|  4    |   Name4  |   30    |   70    |           |  2    |   text22  |   text22  |
                                                   |  2    |   text23  |   text23  |
                                                   |  2    |   text24  |   text24  |

В моих исходных данных у меня есть связь между двумя таблицами по полю ID .Мне нужно присоединить второй стол к первому.Так что это простой результат Leftjoin на table1.ID = table2.ID

|  ID   |   Name   |  Cost   |  Cost2  |   Info1   |   Info2   |  
|-------|----------|---------|---------|-----------|-----------|                                                   
|  1    |   Name1  |   20    |   50    |   text1   |   text1   |                                                   
|  1    |   Name1  |   20    |   50    |   text1   |   text1   |  
|  1    |   Name1  |   20    |   50    |   text1   |   text1   |  
|  2    |   Name2  |   30    |   10    |   text21  |   text21  |  
|  2    |   Name2  |   30    |   10    |   text22  |   text22  |  
|  2    |   Name2  |   30    |   10    |   text23  |   text23  | 
|  2    |   Name2  |   30    |   10    |   text24  |   text24  |
|  2    |   Name22 |   60    |   40    |   text21  |   text21  | 
|  2    |   Name22 |   60    |   40    |   text22  |   text22  | 
|  2    |   Name22 |   60    |   40    |   text23  |   text23  | 
|  2    |   Name22 |   60    |   40    |   text24  |   text24  | 

Как я могу получить результат без дублирования на join для полей (Cost, Cost2)

Ожидаемый результат:

|  ID   |   Name   |  Cost   |  Cost2  |   Info1   |   Info2   |  
|-------|----------|---------|---------|-----------|-----------|                                                   
|  1    |   Name1  |   20    |   50    |   text1   |   text1   |                                                   
|  1    |   Name1  |  NULL   |  NULL   |   text1   |   text1   |  
|  1    |   Name1  |  NULL   |  NULL   |   text1   |   text1   |  
|  2    |   Name2  |   30    |   10    |   text21  |   text21  |  
|  2    |   Name2  |  NULL   |  NULL   |   text22  |   text22  |  
|  2    |   Name2  |  NULL   |  NULL   |   text23  |   text23  | 
|  2    |   Name2  |  NULL   |  NULL   |   text24  |   text24  |
|  2    |   Name22 |   30    |   40    |   text21  |   text21  | 
|  2    |   Name22 |  NULL   |  NULL   |   text22  |   text22  | 
|  2    |   Name22 |  NULL   |  NULL   |   text23  |   text23  | 
|  2    |   Name22 |  NULL   |  NULL   |   text24  |   text24  | 

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Вы можете попытаться использовать оконную функцию row_number, сделать номер строки в подзапросе, затем получить Cost и Cost2 на CASE WHEN, номер строки которого 1

SELECT ID,
    Name,
    CASE WHEN rn = 1 THEN Cost end, 
    CASE WHEN rn = 1 THEN Cost2 end,  
    Info1,
    Info2      
FROM (
    SELECT  
       t1.ID,
       Name,
       Cost,
       Cost2,
       Info1,
       Info2,   
       row_number() over(partition by Name order by Info1) rn
    FROM Table1 t1 JOIN table2 t2 on t1.id = t2.id
) t1

sqlfiddle

0 голосов
/ 22 октября 2018

Вам нужен "номер строки" для join.В ваших таблицах такого нет, но вы можете добавить его, используя row_number():

select coalesce(t1.id, t2.id) as id,
       t1.name, t1.cost, t2.info1, t2.info2
       . . .
from (select t1.*, row_number() over (partition by id order by (select null)) as seqnum
      from table1 t1
     ) full join
     (select t2.*, row_number() over (partition by id order by (select null)) as seqnum
      from table2 t2
     ) t2
     on t1.id = t2.id and t1.seqnum = t2.seqnum;

Вы, увы, не получите name, используя этот метод.Но это имеет смысл.Это только в table1, поэтому оно не должно быть в каждой соответствующей строке.

РЕДАКТИРОВАТЬ:

Это не совсем верно.Вы хотите, чтобы строки повторялись.И тогда значения не появятся.Я думаю, что это условная логика:

Если вам это действительно нужно:

select t1.id, t1.name,
       (case when row_number() over (partition by t1.id order by (select null)) = 1 then cost END) as Cost,
       t2.info1, t2.info2
from table1 t1 join
     table2 t2
     on t1.id = t2.id ;
...