gpt4 book ai didi

sql - 如何编写 RIGHT OUTER JOIN 和 LEFT OUTER JOIN 的组合

转载 作者:行者123 更新时间:2023-12-03 02:30:55 28 4
gpt4 key购买 nike

谁能帮我解决以下问题..

这里我们有1.左外连接2.两个右外连接

如何结合左右 O.J 并创建与上面相同的效果,

我需要重写相同的查询,这是因为我正在将旧的 ms SQL2009 转换为 ms SQL2012..并且在 2012 年 *==* 不受支持.

SELECT X.master_key, X.vendor_code  
FROM
X, Y, X x2
WHERE Y.master_key = X.parent_key
AND Y.master_key *= x2.parent_key
AND x2.INITIALS =* Y.DEFAULT_INITIALS
AND x2.VENDOR_CODE =* Y.VENDOR_ABBREV
AND Y.project_name = 'TEST'

我用我的基本知识修改了上面的代码,如下所示,但它根本不起作用

SELECT X.master_key, X.vendor_code  
FROM
X,
Y left outer join X x2
on Y.master_key = x2.parent_key,

X vnd RIGHT OUTER JOIN Y vnm
(on vnd.INITIALS = vnm.DEFAULT_INITIALS AND vnd.VENDOR_CODE = vnm.VENDOR_ABBREV )

WHERE Y.master_key = X.parent_key
AND Y.project_name = 'TEST'

我没有得到原始查询所需的值。

下面是我完整的原始查询..

SELECT vnd.master_key, vnd.vendor_code  
FROM
vnd, vnm, vnd vn2
WHERE vnm.master_key = vnd.parent_key
AND vnm.master_key *= vn2.parent_key
AND vn2.INITIALS =* vnm.DEFAULT_INITIALS
AND vn2.VENDOR_CODE =* vnm.VENDOR_ABBREV
AND vnm.inactive = 0
AND vnd.inactive = 0
AND vnm.project_name = 'TEST'
ORDER BY
lower(vnm.company_name + ' '), lower(vnd.vendor_code) ,lower(vnd.first_name + ' '), lower(vnd.last_name + ' ')

您提供的解决方案有效,但您也可以执行上述解决方案吗

SELECT X.master_key, X.vendor_code  
FROM X
INNER JOIN Y ON X.parent_key = Y.master_key
LEFT OUTER JOIN X AS x2 ON x2.parent_key = Y.master_key AND x2.INITIALS = Y.DEFAULT_INITIALS AND x2.VENDOR_CODE = Y.VENDOR_ABBREV
WHERE Y.project_name = 'TEST'

问候贾纳基

最佳答案

您不需要同时使用 LEFTRIGHT 连接,因为外侧始终是 X 的 x2 别名 表。

实际上不可能LEFTRIGHT同时连接到同一个表(别名),如果你的意思是同一个连接的两侧需要充当连接谓词的内表。但是,如果您有兴趣获得两个表中的所有行,则始终可以FULL JOIN

同时,您的查询可以转换为以下内容:

SELECT
X.master_key,
X.vendor_code
FROM
X
INNER JOIN Y
ON Y.master_key = X.parent_key
LEFT JOIN X x2
ON Y.master_key = x2.parent_key
AND Y.DEFAULT_INITIALS = x2.INITIALS
AND Y.VENDOR_ABBREV = x2.VENDOR_CODE
WHERE
Y.project_name = 'TEST'
;

INNER JOIN 是两个表之间联接的正常结果:只有在两个 表中都匹配的行才会包含在结果中。最好使用 ANSI 样式的连接,而不是继续将连接条件放在 WHERE 子句中,即使这是可能的。这样就可以更清楚哪些条件仅适用于该查询的独特数据过滤事件,哪些是用于连接特定表的更全局的条件。

与旧式语法相关的LEFTRIGHT连接的更多解释:旧方式,“内部”侧在每个条件中表达 星号位于那一侧。在 ANSI 连接中,连接语义在级别声明。这意味着所有连接谓词都必须转换为 LEFTRIGHT,但不能同时转换为两者。

事实上,除了连接顺序之外,LEFTRIGHT 连接之间没有任何区别。以下两个查询的含义相同:

SELECT *
FROM
TableA
LEFT JOIN TableB
ON A.ID = B.ID
;

SELECT *
FROM
TableB
RIGHT JOIN TableA
ON B.ID = A.ID
;

但是,我们通常会尝试使用 LEFT 连接而不是 RIGHT 连接来构建查询,因为混合它们的查询可能会变得非常难以理解并且非常复杂。容易出错!

对原始查询进行细微修改也可能有助于说明为什么新查询是等效的:

SELECT
X.master_key,
X.vendor_code
FROM
X, Y, X x2
WHERE
Y.master_key = X.parent_key
AND Y.master_key *= x2.parent_key
AND Y.DEFAULT_INITIALS *= x2.INITIALS
AND Y.VENDOR_ABBREV *= x2.VENDOR_CODE
AND Y.project_name = 'TEST'
;

请注意,现在所有 Y 引用都位于左侧,并且连接都是 LEFT 连接。

关于sql - 如何编写 RIGHT OUTER JOIN 和 LEFT OUTER JOIN 的组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20674984/

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