SQL / SQLite:仅当多列匹配时才进行左连接,选择连接结果的字段

时间:2015-04-21 13:39:34

标签: sqlite left-join multiple-columns

我需要左连接两个表。左边有大约1500个条目。这些表有三列必须匹配正确的连接。但是,我无法让它发挥作用。用AND添加所有三个表会产生不正确的结果;

此外,我只需要保留三个ID和#34; someinfo"。我怎么做到这一点?在select中添加字段会产生数百万的额外结果。我是否必须先执行连接然后查询结果?

- 意外结果,三连接,结果太多

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

表:

enter image description here

1 个答案:

答案 0 :(得分:2)

id_1id_2id_3的组合对Table2是否唯一?换句话说,如果id_1 = 555,id_2 = 123,id_3 = 10,这三个值一起只出现在表格中一次?这是第一个查询返回太多结果的唯一原因,否则它应该返回相同的数据,就像只在SELECT上执行Table1一样。


考虑以下代码:

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')

这将为您提供两个包含以下数据的表格:

Unique Data

您的第一个SELECT语句将产生与Table1

中相同的结果

现在,如果我们添加:

insert into @Table2 (id_1, id_2, id_3, someinfo, someotherinfo)
  values (555, 123, 10, 'house', 'old')

所以我们的表数据现在看起来像:

Duplicate data

您的第一个SELECT现在将产生:

Left join - duplicate data

注意555,123,10如何出现两次。如果将此效果乘以1500行,则会产生大量(看似)额外数据。我认为这也可能是您在第二个查询中看到“数百万”结果的原因,以及它与第一个查询不同的原因是因为您现在正在添加来自someinfo的{​​{1}}字段,不同的文本与非唯一ID匹配。


好消息!有一个修复!您只需要在查询中添加Table2,它就会生成您期望的结果

DISTINCT