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_1id_2id_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