Как объединить записи таблицы на основе состояния? - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть таблица, которая должна быть присоединена к другой таблице в зависимости от состояния.Вот пример данных таблицы 1:

ROWID  STATE 
 34     TX
 56     NY
 67     WA
 89     TX

Каждая строка в таблице имеет значение состояния.Таблица 2 имеет две записи для каждого состояния.Вот пример:

ROWID   STATE       NAME  
 19      TX     Chuck, Brown
 20      TX     Nick, Johnes 

Как видно из таблицы 2, для штата Техас есть две записи.Если я использую Left Outer Join и пытаюсь сделать что-то вроде этого:

LEFT OUTER JOIN Table 2 TB2
   ON TB1.STATE = TB2.SATE

, тогда результат будет примерно таким:

34 TX Chuck, Brwon
34 TX Nick, Johnes
89 TX Chuck, Brwon
89 TX Nick, Johnes

Каждая строка дублируется, так как у меня двазаписи в таблице 1 для Техаса.Тогда у меня есть две записи в таблице 2 для Техаса.Я хотел бы видеть следующее:

ROWID   STATE     NAME 1         NAME 2
 34      TX    Chuck, Brwon    Nick, Johnes

По сути, я хочу объединить две строки в одну и затем присоединиться к ТАБЛИЦЕ 1. Я недавно начал работать над этим проектом, и мы используем базу данных Oracle.Если кто-нибудь знает хороший способ добиться этого, пожалуйста, дайте мне знать.Спасибо.

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Как и в одном из комментариев под вопросом, который вы сказали, что вы бы приняли один столбец объединенный NAME, вот один из вариантов;Я использовал CTE для создания таблиц, поэтому вам понадобятся строки 13 и выше.

SQL> with
  2  t1 (rid, state) as
  3    (select 34, 'TX' from dual union all
  4     select 56, 'NY' from dual union all
  5     select 67, 'WA' from dual union all
  6     select 89, 'TX' from dual
  7    ),
  8  t2 (rid, state, name) as
  9    (select 19, 'TX', 'Chuck, Brown' from dual union all
 10     select 20, 'TX', 'Nick, Johnes' from dual
 11    ),
 12  -- start here
 13  it2 as
 14    (select state, listagg(name, ' & ') within group (order by null) name
 15     from t2
 16     group by state
 17    )
 18  select min(t1.rid) rid,
 19    t1.state,
 20    it2.name
 21  from t1 join it2 on t1.state = it2.state
 22  and t1.state = 'TX'
 23  group by t1.state, it2.name;

       RID ST NAME
---------- -- ------------------------------
        34 TX Chuck, Brown & Nick, Johnes

SQL>
0 голосов
/ 03 декабря 2018

На основе примера желаемого вывода я ограничил вывод первым экземпляром состояния в таблице 1 и упорядочил поворотные имена по ID, хотя это соответствует альфа-порядку поля имени для данных данного примера.

См. Это SQL Fiddle

Настройка схемы Oracle 11g R2 :

Обратите внимание, что в Oracle ROWID является зарезервированнымимя, поэтому я изменил его на ID.

CREATE TABLE Table1
    ("ID" number, "STATE" varchar2(2))
;

INSERT ALL 
    INTO Table1 ("ID", "STATE")
         VALUES (34, 'TX')
    INTO Table1 ("ID", "STATE")
         VALUES (56, 'NY')
    INTO Table1 ("ID", "STATE")
         VALUES (67, 'WA')
    INTO Table1 ("ID", "STATE")
         VALUES (89, 'TX')
SELECT * FROM dual
;

CREATE TABLE Table2
    ("ID" number, "STATE" varchar2(2), "NAME" varchar2(12))
;

INSERT ALL 
    INTO Table2 ("ID", "STATE", "NAME")
         VALUES (19, 'TX', 'Chuck, Brown')
    INTO Table2 ("ID", "STATE", "NAME")
         VALUES (20, 'TX', 'Nick, Johnes')
SELECT * FROM dual
;

Запрос 1 :

select t1.id
     , t2.state
     , t2.name
  from (select min(id) id, state from table1 group by state) t1
  join table2 t2
    on t1.state = t2.state

Результаты :

| ID | STATE |         NAME |
|----|-------|--------------|
| 34 |    TX | Nick, Johnes |
| 34 |    TX | Chuck, Brown |

Запрос 2 :

with t1(id, state) as (
  select min(id) id, state from table1 group by state
), t2 as (   
  select state
       , row_number() over (partition by state order by name) rn
       , name
    from table2
)
select t1.id
     , pvt.*
  from t1
  join t2 pivot (max(name) for rn in (1 name_1,2 name_2)) pvt
    on t1.state = pvt.state

Результаты :

| ID | STATE |       NAME_1 |       NAME_2 |
|----|-------|--------------|--------------|
| 34 |    TX | Chuck, Brown | Nick, Johnes |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...