解释sql join语句

dced5bon  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(404)

我应该把这个查询从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

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

wgx48brx

wgx48brx1#

你被正确地教导应该列出你的连接子句( ON... )第二个查询显然更具可读性,是首选。类似地,旧式连接只是列出列表中的所有内容 WHERE 条款 INNER JOIN 不过,这一点很难理解。关于你不同的结果。它们不同是因为 cvn 表名不同于 tblcvn 意思是它是另一个物体。如果那是o型的话。。。
一开始你 LEFT JOINingtblloadingmonths 以及 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 条款。这将使您可以对自己的部分进行一些编辑:

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 join隐式地生成了一个笛卡尔积,您可以通过 CROSS JOIN 如您所回答的,在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 
     tblvendorindex 
CROSS JOIN tblloadingmonths
LEFT JOIN 
    cvn ON  tblloadingmonths.month = cnv.month 
    AND tblvendorindex.vendorindexid = cvn.vendorindexid

相关问题