我应该把这个查询从mysql转换到sqlserver。但是,join语句让我很反感。我没有见过这样的连接,我有点困惑如何翻译它。
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表没有任何公共字段,但是它们被连接,然后用cvn连接。我一直被教导做tablea join tableb on cola=colb join tablec on colb=colc,但不是tablea join tableb left join tablec on cola=colc和colb=colc。从目前的情况来看,查询不能以连接的方式在SQLServer中运行。我必须这样设置:
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
对于这个转换后的查询,我得到了不同的结果。任何指导都将不胜感激
1条答案
按热度按时间wgx48brx1#
你被正确地教导应该列出你的连接子句(
ON...
)第二个查询显然更具可读性,是首选。类似地,旧式连接只是列出列表中的所有内容WHERE
条款INNER JOIN
不过,这一点很难理解。关于你不同的结果。它们不同是因为cvn
表名不同于tblcvn
意思是它是另一个物体。如果那是o型的话。。。一开始你
LEFT JOINing
到tblloadingmonths
以及tblloadingmonths
table。。。这意味着这两个行(对于join子句)中都必须存在tblcvn
要返回的行。不过,既然是LEFT JOIN
,的行tblloadingmonths
以及tblloadingmonths
将被返回,无论是否匹配tblcvn
. 在第二种情况下,您正在使用cvn
作为基表并使用INNER JOIN
贯穿始终。这意味着中的行的join子句必须存在匹配项cvn
被退回。否则,它们将被过滤。当使用
LEFT JOIN
...房间里的table
FROM
条款很重要。换成一个LEFT JOIN
表可能会更改结果(如您所见)a中的标准
WHERE
条款可以扭转局面LEFT
变成一个INNER
加入。我不能告诉你mysql是基于键分配自动分配连接,还是在生成笛卡尔积。使用时
JOIN
在sql server中,必须列出ON
条款。你可以用老式的连接。。。FROM Table1, Table2...
但这应该让你成为笛卡尔人,没有WHERE
条款。这将使您可以对自己的部分进行一些编辑:感谢您的评论,您确认mysql join隐式地生成了一个笛卡尔积,您可以通过
CROSS JOIN
如您所回答的,在sql server中显式地。