Объедините 2 запроса, чтобы получить данные в одной строке в Oracle - PullRequest
1 голос
/ 03 апреля 2019

Я создал 2 результата запроса, как показано ниже:

Запрос 1:

ID Name Value Choice
1  abc   10    x
2  def   20    x

Запрос 2:

ID1 Name1 Value1 Choice1
1  eft   10    y
2  bgf   20    y

Я добавил полный внешнийобъединение и набор результатов похожи на

ID   Name Value Choice ID1  Name1 Value1 Choice1
1    abc   10    x     null null   null    null
2    def   20    x     null null   null    null
null null  null  null  1     eft     10    y 
null null  null  null  2     bgf     20    y 

Но мне нужно, как показано ниже:

ID   Name Value Choice ID1  Name1 Value1 Choice1
1    abc   10    x     1     eft     10    y 
2    def   20    x     2     bgf     20    y 

Не уверен, какое объединение или логику я должен использовать.

Ответы [ 2 ]

1 голос
/ 03 апреля 2019

Не уверен, как выглядит ваше условие FULL JOIN. Однако, если вы хотите «получать записи бок о бок» (как указано в вашем комментарии), вы можете сделать что-то вроде ...

select *
from (
  select 1 as id, 'abc' as name, 10 as value, 'x' as choice from dual union all
  select 2, 'def', 20, 'x' from dual
) Q1 full outer join (
  select 1 as id1, 'eft' as name1, 10 as value1, 'y' as choice1 from dual union all
  select 2, 'bgf', 20, 'y' from dual
) Q2
  on Q1.id = Q2.id1 
;

-- result
ID  NAME  VALUE  CHOICE  ID1  NAME1  VALUE1  CHOICE1  
1   abc   10     x       1    eft    10      y        
2   def   20     x       2    bgf    20      y 

Это, конечно, даст вам NULL для идентификаторов, которые не "совпадают". Например (одно и то же соединение, разные данные)

select *
from (
  select 1 as id, 'abc' as name, 10 as value, 'x' as choice from dual union all
  select 2, 'def', 20, 'x' from dual union all
  select 4, '_4_', 40, 'g' from dual
) Q1 full outer join (
  select 1 as id1, 'eft' as name1, 10 as value1, 'y' as choice1 from dual union all
  select 2, 'bgf', 20, 'y' from dual union all
  select 5, '_5_', 50, 'z' from dual
) Q2
  on Q1.id = Q2.id1 
;

ID    NAME   VALUE   CHOICE  ID1   NAME1  VALUE1  CHOICE1  
1     abc    10      x       1     eft    10      y        
2     def    20      x       2     bgf    20      y        
NULL  NULL   NULL    NULL    5     _5_    50      z        
4     _4_    40      g       NULL  NULL   NULL    NULL

Предлагаемое Ponder Stibbon решение (спасибо!), Возможно, удалит некоторые из NULL, но в некоторых строках набора результатов могут оказаться записи с разными идентификаторами.

select *
from ( 
  select id, name, value, choice, rownum row_
  from (
    select 1 as id, 'abc' as name, 10 as value, 'x' as choice from dual union all
    select 2, 'def', 20, 'x' from dual union all
    select 4, '_4_', 40, 'g' from dual
  ) 
) Q1 full join (
  select id1, name1, value1, choice1, rownum row_
  from (
    select 1 as id1, 'eft' as name1, 10 as value1, 'y' as choice1 from dual union all
    select 2, 'bgf', 20, 'y' from dual union all
    select 5, '_5_', 50, 'z' from dual
  )
) Q2 on Q1.row_ = Q2.row_
;

-- result
ID  NAME  VALUE  CHOICE  ROW_  ID1  NAME1  VALUE1  CHOICE1  ROW_  
1   abc   10     x       1     1    eft    10      y        1     
2   def   20     x       2     2    bgf    20      y        2     
4   _4_   40     g       3     5    _5_    50      z        3  
1 голос
/ 03 апреля 2019

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

WITH cte1 AS (
    -- first query
),
cte2 AS (
    -- second query
)

SELECT t1.ID, t1.Name, t1."Value", t1.Choice, t2.ID1, t2.Name1, t2.Value1, t2.Choice1
FROM cte2 t1
INNER JOIN cte2 t2
    ON t1.ID = t2.ID1;
...