SQL/SQLite: Left join only if multiple columns match, select字段为join结果
SQL/SQLite: Left join only if multiple columns match, select fields for the join result
我需要左连接两个表。左边的有大约 1500 个条目。这些表具有三列,必须匹配才能进行正确的连接。不过,我无法让它工作。用 AND 添加所有三个表会产生不正确的结果; WHERE 子句(在连接之后)不是 return 完整的左连接。
此外,我只需要保留三个ID和"someinfo"。我将如何做到这一点?在 select 中添加该字段会产生数百万个额外结果。是不是必须先join再查询结果?
-- 意外结果,三重连接,结果太多
SELECT t1.*
FROM Table1 t1
LEFT JOIN Table2 t2
ON t1.id_1 = t2.id_1
AND t1.id_2 = t2.id_2
AND t1.id_3 = t2.id_3
-- 数百万条结果
SELECT t1.*, t2.someinfo
FROM Table1 t1
LEFT JOIN Table2 t2
ON t1.id_1 = t2.id_1
AND t1.id_2 = t2.id_2
AND t1.id_3 = t2.id_3
表:
id_1
、id_2
和 id_3
的组合是 Table2
独有的吗?换句话说,如果 id_1
= 555、id_2
= 123 和 id_3
= 10,这三个值在 table?这是第一个查询会 return 太多结果的唯一原因,否则它应该 return 与仅在 Table1
上执行 SELECT
相同的数据。
考虑这段代码:
declare @Table1 table (id_1 int, id_2 int, id_3 int)
declare @Table2 table (id_1 int, id_2 int, id_3 int,
someinfo varchar(20), someotherinfo varchar(20))
insert into @Table1 (id_1, id_2, id_3) values (555, 123, 10)
insert into @Table1 (id_1, id_2, id_3) values (555, 123, 10)
insert into @Table2 (id_1, id_2, id_3, someinfo, someotherinfo)
values (555, 123, 10, 'house', 'new')
insert into @Table2 (id_1, id_2, id_3, someinfo, someotherinfo)
values (555, 123, 11, 'tree', 'new')
insert into @Table2 (id_1, id_2, id_3, someinfo, someotherinfo)
values (555, 124, 1, 'car', 'new')
这将为您提供两个具有以下数据的 table:
您的第一个 SELECT
语句将产生与 Table1
中相同的结果
现在如果我们添加:
insert into @Table2 (id_1, id_2, id_3, someinfo, someotherinfo)
values (555, 123, 10, 'house', 'old')
所以我们的 table 数据现在看起来像:
您的第一个 SELECT
现在将产生:
注意 555、123、10 是如何出现两次的。如果将此效果乘以超过 1500 行,它将产生大量(看似)额外的数据。我认为这也可能是您在第二个查询中看到 "millions" 结果的原因,它与第一个查询不同的原因是因为您现在从 [=16= 添加 someinfo
字段] 并且不同的文本与非唯一 ID 匹配。
好消息!有一个修复!您只需将 DISTINCT
添加到您的查询中,它应该会产生您期望的结果
SELECT DISTINCT t1.*
FROM @Table1 t1
LEFT JOIN @Table2 t2
ON t1.id_1 = t2.id_1
AND t1.id_2 = t2.id_2
AND t1.id_3 = t2.id_3
SELECT DISTINCT t1.*, t2.someinfo
FROM @Table1 t1
LEFT JOIN @Table2 t2
ON t1.id_1 = t2.id_1
AND t1.id_2 = t2.id_2
AND t1.id_3 = t2.id_3
我需要左连接两个表。左边的有大约 1500 个条目。这些表具有三列,必须匹配才能进行正确的连接。不过,我无法让它工作。用 AND 添加所有三个表会产生不正确的结果; WHERE 子句(在连接之后)不是 return 完整的左连接。
此外,我只需要保留三个ID和"someinfo"。我将如何做到这一点?在 select 中添加该字段会产生数百万个额外结果。是不是必须先join再查询结果?
-- 意外结果,三重连接,结果太多
SELECT t1.*
FROM Table1 t1
LEFT JOIN Table2 t2
ON t1.id_1 = t2.id_1
AND t1.id_2 = t2.id_2
AND t1.id_3 = t2.id_3
-- 数百万条结果
SELECT t1.*, t2.someinfo
FROM Table1 t1
LEFT JOIN Table2 t2
ON t1.id_1 = t2.id_1
AND t1.id_2 = t2.id_2
AND t1.id_3 = t2.id_3
表:
id_1
、id_2
和 id_3
的组合是 Table2
独有的吗?换句话说,如果 id_1
= 555、id_2
= 123 和 id_3
= 10,这三个值在 table?这是第一个查询会 return 太多结果的唯一原因,否则它应该 return 与仅在 Table1
上执行 SELECT
相同的数据。
考虑这段代码:
declare @Table1 table (id_1 int, id_2 int, id_3 int)
declare @Table2 table (id_1 int, id_2 int, id_3 int,
someinfo varchar(20), someotherinfo varchar(20))
insert into @Table1 (id_1, id_2, id_3) values (555, 123, 10)
insert into @Table1 (id_1, id_2, id_3) values (555, 123, 10)
insert into @Table2 (id_1, id_2, id_3, someinfo, someotherinfo)
values (555, 123, 10, 'house', 'new')
insert into @Table2 (id_1, id_2, id_3, someinfo, someotherinfo)
values (555, 123, 11, 'tree', 'new')
insert into @Table2 (id_1, id_2, id_3, someinfo, someotherinfo)
values (555, 124, 1, 'car', 'new')
这将为您提供两个具有以下数据的 table:
您的第一个 SELECT
语句将产生与 Table1
现在如果我们添加:
insert into @Table2 (id_1, id_2, id_3, someinfo, someotherinfo)
values (555, 123, 10, 'house', 'old')
所以我们的 table 数据现在看起来像:
您的第一个 SELECT
现在将产生:
注意 555、123、10 是如何出现两次的。如果将此效果乘以超过 1500 行,它将产生大量(看似)额外的数据。我认为这也可能是您在第二个查询中看到 "millions" 结果的原因,它与第一个查询不同的原因是因为您现在从 [=16= 添加 someinfo
字段] 并且不同的文本与非唯一 ID 匹配。
好消息!有一个修复!您只需将 DISTINCT
添加到您的查询中,它应该会产生您期望的结果
SELECT DISTINCT t1.*
FROM @Table1 t1
LEFT JOIN @Table2 t2
ON t1.id_1 = t2.id_1
AND t1.id_2 = t2.id_2
AND t1.id_3 = t2.id_3
SELECT DISTINCT t1.*, t2.someinfo
FROM @Table1 t1
LEFT JOIN @Table2 t2
ON t1.id_1 = t2.id_1
AND t1.id_2 = t2.id_2
AND t1.id_3 = t2.id_3