gpt4 book ai didi

sql - 获得额外的行 - 使用左连接加入 3 个表后

转载 作者:行者123 更新时间:2023-12-01 09:39:55 24 4
gpt4 key购买 nike

SELECT (b.descr || ' - ' || c.descr) description
FROM tbl1 a LEFT JOIN tbl2 b ON a.ACCOUNT = b.ACCOUNT
LEFT JOIN tbl3 c ON a.product = c.product
WHERE a.descr50 = ' ' ;

table1 只有 7622 行,descr50 = ' ' 但此选择返回 7649 行。你能帮我解决这个问题吗?提前致谢

最佳答案

当您将两个或多个表JOIN 在一起时,您可以有效地获得这些表的笛卡尔积,其中应用了 JOIN 条件中声明的过滤器。

当您使用过时的隐式 JOIN 语法时,这一点会更加明显。

LEFT JOIN 保证您得到的行数不会超过最左边的表所包含的行数,即。 e.最左边表格中的每一行至少返回一次。

如果过滤器不是一对一的行映射,您仍然可以获得更多行。

在你的情况下:

SELECT  (b.descr || ' - ' || c.descr) description
FROM tbl1 a
LEFT JOIN
tbl2 b
ON b.ACCOUNT = a.ACCOUNT
LEFT JOIN
tbl3 c
ON c.product = a.product
WHERE a.descr50 = ' '

accountproductbc 中不是唯一的。

对于这些行:

a.account

1
2
3

b.account b.description

1 Account 1
2 Account 2 - old
2 Account 2 - new

JOIN 将返回以下内容:

a.account b.account b.description

1 1 Account 1
2 2 Account 2 - old
2 2 Account 2 - new
3 NULL NULL

,为您提供的行数比任何一个表包含的都多。

要从任一表中选择第一个匹配的描述,请使用:

SELECT  (
SELECT FIRST_VALUE(descr) OVER (ORDER BY descr)
FROM tbl2 b
WHERE b.account = a.account
AND rownum = 1
) || ' - ' ||
(
SELECT FIRST_VALUE(descr) OVER (ORDER BY descr)
FROM tbl3 c
WHERE c.product= a.product
AND rownum = 1
) description
FROM tbl1 a
WHERE a.descr50 = ' '

要更新,只需将查询包装到内联 View 中:

UPDATE  (
SELECT (
SELECT FIRST_VALUE(descr) OVER (ORDER BY descr)
FROM tbl2 b
WHERE b.account = a.account
AND rownum = 1
) || ' - ' ||
(
SELECT FIRST_VALUE(descr) OVER (ORDER BY descr)
FROM tbl3 c
WHERE c.product= a.product
AND rownum = 1
) description
FROM tbl1 a
WHERE a.descr50 = ' '
)
SET descr50 = description

关于sql - 获得额外的行 - 使用左连接加入 3 个表后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1199733/

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