gpt4 book ai didi

mysql - 解释 SQL 连接语句

转载 作者:行者123 更新时间:2023-11-30 21:41:37 24 4
gpt4 key购买 nike

我应该将此查询从 MYSQL 转换为 SQL Server。但是,连接语句让我失望了。我还没有看到这样的连接,我对如何翻译它有点困惑。

SELECT 
`Supplier Confirmed Orders` + `Log Tech Confirmed Orders` AS 'orders confirmed',
`Orders in CVN`-`Cancelled Orders` AS 'Orders in CVN',
tblloadingmonths.`month`,
tblvendorindex.`vendorindexid`,
'Service' AS category
FROM
tblloadingmonths
JOIN
tblvendorindex
LEFT JOIN
tblcvn ON tblloadingmonths.`month` = tblcvn.`month`
AND tblvendorindex.vendorindexid = tblcvn.vendorindexid

让我失望的是 loadingmonths 和 vendorindex 表没有任何公共(public)字段,但它们正在连接,然后与 cvn 连接。我一直被教导做 tableA join tableB ON colA = colB join tableC ON colB = colC,但不是 tableA join talbeB left join tableC ON colA = colC AND colB = colC。就目前而言,查询无法在 SQL Server 中以连接的方式运行。我必须这样设置:

SELECT 
CVN.[Supplier Confirmed Orders] + CVN.[Log Tech Confirmed Orders] AS 'orders confirmed',
(CVN.[Orders in CVN] - CVN.[Cancelled Orders]) AS 'Orders in CVN',
tblloadingmonths.month,
tblvendorindex.vendorindexid,
'Service' AS category,
'CVN Compliance' as metric
FROM
cvn
JOIN
tblvendorindex ON tblvendorindex.vendorindexid = CVN.vendorindexid
INNER JOIN
tblloadingmonths ON tblloadingmonths.month = CVN.month

对于这个转换后的查询,我得到了不同的结果。任何指导将不胜感激

最佳答案

你被教导正确,你应该列出你的连接子句 (ON...) 并且第二个查询显然更具可读性并且是首选。类似地,旧式连接只是简单地列出 INNER JOINWHERE 子句中的所有内容,但这同样难以阅读。关于你的不同结果。它们是不同的,因为

  1. cvn 表名与 tblcvn 不同,这意味着它是不同的对象。如果那是 o 型那么......
  2. 首先,您LEFT JOINing tblloadingmonthstblloadingmonths 表...意味着行必须存在于这两个表中(对于您的连接子句)用于要返回的 tblcvn 行。但是,由于它是 LEFT JOIN,因此无论 tblcvn 是否匹配,都将返回 tblloadingmonthstblloadingmonths 的行>。在第二个中,您使用 cvn 作为基表并在整个过程中使用 INNER JOIN。这意味着要返回的 cvn 中的行的连接子句必须存在匹配项。否则,它们将被过滤掉。

回顾一下,当使用 LEFT JOIN 时......

  1. FROM 子句中的表很重要。用 LEFT JOIN 表交换它可以改变结果(如您所见)
  2. WHERE 子句中的条件可以将 LEFT 转换为 INNER 连接。

我无法告诉您 MySQL 是根据键分配自动分配连接,还是生成笛卡尔积。在 SQL Server 中使用 JOIN 时,您必须列出 ON 子句。您可以使用旧式联接... FROM Table1, Table2... 但这应该让您成为没有 WHERE 子句的笛卡尔。这应该让您完成一些编辑:

SELECT 
CVN.[Supplier Confirmed Orders] + CVN.[Log Tech Confirmed Orders] AS 'orders confirmed',
(CVN.[Orders in CVN] - CVN.[Cancelled Orders]) AS 'Orders in CVN',
tblloadingmonths.month,
tblvendorindex.vendorindexid,
'Service' AS category,
'CVN Compliance' as metric
FROM
tblvendorindex
INNER JOIN
tblloadingmonths ON tblvendorindex.??? = tblloadingmonths.???? --find out what the relation is, a foreign key perpahs. Would need a data model to determine.
LEFT JOIN
cvn ON tblloadingmonths.month = cnv.month
AND tblvendorindex.vendorindexid = cvn.vendorindexid

感谢您的评论,您确认 MySQL 联接正在隐式生成笛卡尔积,正如您回答的那样,您可以在 SQL Server 中显式地使用 CROSS JOIN 实现这一点。

SELECT 
CVN.[Supplier Confirmed Orders] + CVN.[Log Tech Confirmed Orders] AS 'orders confirmed',
(CVN.[Orders in CVN] - CVN.[Cancelled Orders]) AS 'Orders in CVN',
tblloadingmonths.month,
tblvendorindex.vendorindexid,
'Service' AS category,
'CVN Compliance' as metric
FROM
tblvendorindex
CROSS JOIN tblloadingmonths
LEFT JOIN
cvn ON tblloadingmonths.month = cnv.month
AND tblvendorindex.vendorindexid = cvn.vendorindexid

关于mysql - 解释 SQL 连接语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51271399/

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