У меня есть 2 таблицы 1 и 2, я хочу запросить объединение результатов, как показано ниже.
Таблица 1
Таблица 2
Результат запроса должен быть
Это выглядит очень просто, но я не смог этого понять. Я использую базу данных SQL Server 2019 и SSMS19. Я пытался,
select t1.*, t2.Fruit
from Table_1 t1
left join Table_2 t2 on t1.ID = t2.ID
Как сказал @DaleK, или вы пропустили регистрацию на Age left join Table_2 t2 on t1.ID = t2.ID and t1.Age = t2.Age
Привет, Алан, вот результат: Красный, Оранжевый; Красное яблоко; Желтый, Оранжевый; Желтый, Яблоко, Но я не хочу, чтобы Красный и Желтый повторялись. Если количество фруктов и цвет не равны, мне нужно указать нулевое значение.
Вы должны использовать right join
, чтобы получить результат null
, если связь отсутствует. Но вам следует добавить еще одну таблицу Table_1_Table_2
, чтобы сделать отношение «один к одному», или добавить столбец в table_1 table_2_ROW
, чтобы управлять такой структурой. И запрос
select t1.*, t2.Fruit
from Table_2 t2
right join Table_1_Table_2 t1_t2 on t1_t2.fruitRef_ROW = t2.ROW
right join Table_1 t1 on t1_t2.colorRef_ROW = t1.ROW`
На основе вашего набора данных вам необходимо создать свой собственный рейтинг в каждой группе ID/Age
, чтобы вы могли объединяться между таблицами. Затем вам нужно использовать FULL JOIN
, потому что вам нужны данные из любой таблицы. Следующий запрос дает желаемый результат:
DECLARE @T1 TABLE(RowID INT, ID INT, Age INT, Color VARCHAR(20));
INSERT @T1(RowID, ID, Age, Color)
VALUES
(1, 1234, 15, 'Red'),
(2, 1234, 15, 'Yellow'),
(3, 1235, 16, 'Green'),
(4, 1235, 16, 'Yellow'),
(5, 1235, 16, 'White'),
(6, 1235, 16, 'Green'),
(7, 1236, 21, 'Black'),
(8, 1236, 21, 'Pink');
DECLARE @T2 TABLE(RowID INT, ID INT, Age INT, Fruit VARCHAR(20));
INSERT @T2(RowID, ID, Age, Fruit)
VALUES
(1, 1234, 15, 'Orange'),
(2, 1234, 15, 'Apple'),
(3, 1235, 16, 'Banana'),
(4, 1235, 16, 'Peach'),
(5, 1236, 21, 'Banana'),
(6, 1236, 21, 'Orange'),
(7, 1236, 21, 'Kiwifruit');
SELECT RowID = ROW_NUMBER() OVER(ORDER BY ISNULL(t1.ID,t2.ID)),
ID = ISNULL(t1.ID,t2.ID),
Age = ISNULL(t1.Age,t2.Age),
t1.Color,
t2.Fruit
FROM ( SELECT *, RowNumber=ROW_NUMBER() OVER(PARTITION BY ID,t.Age ORDER BY t.RowID)
FROM @T1 AS t
) AS t1
FULL JOIN
( SELECT *, RowNumber=ROW_NUMBER() OVER(PARTITION BY ID,t.Age ORDER BY t.RowID)
FROM @T2 AS t
) AS t2
ON t2.ID = t1.ID
AND t2.Age = t1.Age
AND t2.RowNumber = t1.RowNumber
Приведенный ниже запрос должен дать правильный результат:
SELECT
COALESCE(t1.ID, t2.ID) AS ID,
COALESCE(t1.Age, t2.Age) AS Age,
t1.Color,
t2.Fruit
FROM Table_1 t1
FULL OUTER JOIN Table_2 t2
ON t1.ID = t2.ID AND t1.Age = t2.Age
ORDER BY ID, Age, Color, Fruit;
Вам не хватает одного условия присоединения
left join Table_2 t2 on t1.ID = t2.ID and t1.Row# = t2.Row#