gpt4 book ai didi

sqlite - SQL/SQLite : Left join only if multiple columns match, 为连接结果选择字段

转载 作者:行者123 更新时间:2023-12-03 16:21:17 25 4
gpt4 key购买 nike

我需要左连接两个表。左边的大约有 1500 个条目。这些表具有三个必须匹配才能进行正确连接的列。不过,我无法让它工作。使用 AND 将所有三个表相加会产生错误的结果; WHERE 子句(在连接之后)不会返回完整的左连接。

此外,我只需要保留三个 ID 和“someinfo”。我将如何做到这一点?在选择中添加字段会产生数百万个额外的结果。我是否必须先执行连接然后查询结果?

-- 意想不到的结果,三重连接,结果太多

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

最佳答案

id_1的组合, id_2 , 和 id_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字段来自 Table2并且不同的文本与非唯一 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

关于sqlite - SQL/SQLite : Left join only if multiple columns match, 为连接结果选择字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29773872/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com