Как получить значения всех совпадающих столбцов таблицы и сохранить в новой таблице в SQL - PullRequest
0 голосов
/ 05 июля 2018

у меня 3 стола

Table 1 
ID  ParentID
234 456
123 456
344 789

Таблица 2

ID  col1 col2   CID
234 x    879    3
456 x    x      2
987 x    x      1
344 x    x      5
999 x    x      6

Таблица3

TID  col1 col2  col3
1   x    X       x
2   x    x       x
3   x    x       x
4   x    x       x
5   x    x       x

Я пытаюсь достичь

  1. Соответствие идентификатора и parentID таблицы 1 столбцу идентификатора таблицы table2
  2. Необходимо сохранить результаты совпавших и несопоставленных идентификаторов и родительских идентификаторов таблицы table1 в новая таблица4 с сопоставленными / не сопоставленными флагами 'Y' и 'N'.

  3. Для совпадающих идентификаторов необходимо получить значения col3 из таблицы 3 на основе CID = TID и сохранить в таблице 4

Я пытаюсь построить подзапросы. Как получить соответствующий, а затем продолжить.

SELECT * FROM table1 t1 INNER JOIN table2 t2  ON t1.ID=t2.ID AND t1.ParentID=t2.ID

но я получаю только одну строку, а не ID '123' таблицы 1

Таблица результатов

ID  ParentID
234 456

Может кто-нибудь помочь мне в этом?

спасибо!

Ответы [ 3 ]

0 голосов
/ 05 июля 2018

Вы можете использовать оператор create table as.

Создать таблицу как (любой запрос, который возвращает некоторое количество столбцов);

тогда вы можете использовать

   insert into (select  Same query that returns atleast one row)

оператор для хранения значений

0 голосов
/ 05 июля 2018

Вы можете использовать LEFT JOIN два раза, чтобы получить совпадающие и несоответствующие значения для каждого ID и ParentID. Кроме того, вам даже не нужно материализовать результаты, чтобы выполнить JOIN до последней таблицы.

DECLARE @DataSource01 TABLE
(
    [ID] SMALLINT
   ,[ParentID] INT
);

DECLARE @DataSource02 TABLE
(
    [ID] SMALLINT
   ,[col1] CHAR(1)
   ,[col2] VARCHAR(3)
   ,[CID] TINYINT
);

DECLARE @DataSource03 TABLE
(
    [TID] SMALLINT
   ,[col1] CHAR(1)
   ,[col2] CHAR(1)
   ,[col3] CHAR(1)
);

INSERT INTO @DataSource01 ([ID],[ParentID])
VALUES (234, 456)
      ,(123, 456)
      ,(344, 789);

INSERT INTO @DataSource02 ([ID], [col1], [col2], [CID])
VALUES (234, 'x', '879', 3)
      ,(456, 'x', 'x', 2)
      ,(987, 'x', 'x', 1)
      ,(344, 'x', 'x', 5)
      ,(999, 'x', 'x', 6);

INSERT INTO @DataSource03 ([TID], [col1], [col2], [col3])
VALUES (1, 'x', 'X', 'x')
      ,(2, 'x', 'x', 'x')
      ,(3, 'x', 'x', 'x')
      ,(4, 'x', 'x', 'x')
      ,(5, 'x', 'x', 'x');

SELECT DS1.[ID]
      ,DS1.[ParentID]
      ,CASE WHEN DS2_1.[ID] IS NULL THEN 'N' ELSE 'Y' END
      ,CASE WHEN DS2_2.[ID] IS NULL THEN 'N' ELSE 'Y' END
FROM @DataSource01 DS1
LEFT JOIN @DataSource02 DS2_1
    ON DS1.[ID] = DS2_1.[ID]
LEFT JOIN @DataSource02 DS2_2
    ON DS1.[ParentID] = DS2_2.[ID];


SELECT DS1.[ID]
      ,DS1.[ParentID]
      ,CASE WHEN DS2_1.[ID] IS NULL THEN 'N' ELSE 'Y' END
      ,CASE WHEN DS2_2.[ID] IS NULL THEN 'N' ELSE 'Y' END
      ,DS3.[TID]
FROM @DataSource01 DS1
LEFT JOIN @DataSource02 DS2_1
    ON DS1.[ID] = DS2_1.[ID]
LEFT JOIN @DataSource02 DS2_2
    ON DS1.[ParentID] = DS2_2.[ID]
LEFT JOIN @DataSource03 DS3
    ON DS2_1.[CID] = DS3.[TID];

enter image description here

Это основы объединения данных. Теперь вы можете делать все, что вам нужно (PIVOT, материализовано, фильтровать).

0 голосов
/ 05 июля 2018

Вы можете получить нужные записи, используя запрос ниже, а затем вставить их в table4.

with cte as 
(
Select distinct(id) as Id from table1 union Select distinct(ParentId) as Id from table1
)
Select cte.Id, CASE WHEN table2.Id is null THEN 'N' ELSE 'Y' END As IsMatched, table3.TID
from cte
left join table2
on table2.Id = cte.Id
left join table3 
on table3.TID = table2.CID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...