SQL объединяет две таблицы и сохраняет имя таблицы в столбце - PullRequest
0 голосов
/ 30 октября 2018

Я пытаюсь объединить две таблицы, сохранив информацию о том, из какой таблицы эта запись.

Например, с учетом этого ввода

Table A
Column1   Column2
   0         X
   1         Y

Table B
Column1   Column2
   3         Z
   1         Y

Я хочу закончить с этим:

Table C
Column1   Column2 Column3
   0         X        A
   1         Y        A
   3         Z        B

Я попробовал оператор INSERT INTO, но не могу вставить другой текст в Column3, не получив все дубликаты, например, из. Таблица 2

Ответы [ 5 ]

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

Кажется, вам нужны строки из a, а затем другие строки из b. Это не совсем союз.

Я бы подошел к этому как:

select a.column1, a.column2, 'a' as column3
from a
union all
select b.column1, b.column2, 'b' as column3
from b
where not exists (select 1 from a where a.column1 = b.column1);
0 голосов
/ 30 октября 2018

Вы можете попытаться использовать UNION, объединить tableA и tableB, а затем использовать outer join с CASE WHEN, чтобы сделать это.

WITH CTE AS (
  SELECT Column1,Column2
  FROM TableA
  UNION 
  SELECT Column1,Column2
  FROM TableB
)
SELECT t1.*,(case when t2.COLUMN1 is NOT null THEN 'A' ELSE 'B' END) Column3
FROM CTE t1 
LEFT JOIN  TableA  t2 on t1.COLUMN1 = t2.COLUMN1 and t1.COLUMN2 = t2.COLUMN2

sqlfiddle

Column1 Column2 Column3
0       X       A
1       Y       A
3       Z       B
0 голосов
/ 30 октября 2018

Вы можете использовать оконную функцию row_number()

with cte as
(
select column1,column2,'A' as column3 from tableA
union all
select column1,column2,'B' as column3 from tableB
) , cte2 as
(
select * , row_number() over(partition by column1,column2 order by column3 ) rn
from cte
) select column1,column2,column3 from cte2 where rn=1

демонстрационная ссылка

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

Примерно так может быть решение, которое вы ищете.

SELECT Column1, Column2, 'A' AS Column3
FROM [Table A]
UNION
SELECT Column1, Column2, 'B' AS Column3
FROM (
    SELECT Column1, Column2 
    FROM [Table B]
        EXCEPT
    SELECT Column1, Column2 
    FROM [Table A]
) b

Мне странно, что это не работает. Ваши требования можно перевести как:

  1. Возьмите все строки из набора A и добавьте столбец со значением A.
  2. Возьмите все строки из набора B , которых нет в наборе A , и добавьте столбец со значением B.
  3. Вернуть оба результата с шага 1 и 2 .

И это то, что делает этот запрос.

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

Вы хотите full outer join:

SELECT COALESCE(a.col1, b.col1), COALESCE(a.col2, b.col2), 
       (CASE WHEN a.col1 IS NOT NULL 
             THEN 'A' 
             ELSE 'B' 
        END)
FROM tableA a FULL OUTER JOIN
     tableB b
     ON b.col1 = a.col1;
...