使用sql连接两个表
我试图基于左表连接这两个表,并匹配行值。右表不一定包含左表中的所有使用sql连接两个表,sql,sql-server,Sql,Sql Server,我试图基于左表连接这两个表,并匹配行值。右表不一定包含左表中的所有ITEMNUMs。并不是每个VNDITNUM都会在左侧表格中有一个ITEMNUM LEFT TABLE (559 rows) --Filtered based on column IVCOGSIX = 137 SELECT ITEMNMBR FROM dbo.IV00101 WHERE IVCOGSIX = 137 +---------+ | ITEMNUM | +---------+ | Item 1
ITEMNUM
s。并不是每个VNDITNUM
都会在左侧表格中有一个ITEMNUM
LEFT TABLE (559 rows)
--Filtered based on column IVCOGSIX = 137
SELECT
ITEMNMBR
FROM dbo.IV00101
WHERE IVCOGSIX = 137
+---------+
| ITEMNUM |
+---------+
| Item 1 |
| Item 2 |
| Item 3 |
| Item 4 |
+---------+
RIGHT TABLE (553 rows)
--Filtered based on column VENDORID = 90505EP
SELECT
ITEMNMBR,
VNDITNUM
FROM dbo.IV00103
WHERE VENDORID = '90505EP'
+---------+-------------+
| ITEMNUM | VNDITNUM |
+---------+-------------+
| Item 1 | VendorNum 1 |
| Item 2 | VendorNum 2 |
| Item 4 | VendorNum 4 |
| Item X | VendorNum 5 |
+---------+-------------+
我想要得到的结果是-
JOINED TABLE (559 rows)
+---------+-------------+
| ITEMNUM | VNDITNUM |
+---------+-------------+
| Item 1 | VendorNum 1 |
| Item 2 | VendorNum 2 |
| Item 3 | NULL |
| Item 4 | VendorNum 4 |
+---------+-------------+
然而,我的查询只给出548行,我不一定确定它遗漏了哪些行
这是我目前的问题-
SELECT
cogs.ITEMNMBR,
vin.VNDITNUM
FROM METRO.dbo.IV00101 cogs
LEFT JOIN METRO.dbo.IV00103 vin
on vin.ITEMNMBR = cogs.ITEMNMBR
WHERE
cogs.IVCOGSIX = 137
AND vin.VENDORID = '90505EP'
如何连接这两个表以获得左表的559行以及右表中的任何匹配项?您的连接谓词vin.VENDORID='90505EP'已有效地将左连接转换为内部连接 试试这个
SELECT
cogs.ITEMNMBR,
vin.VNDITNUM
FROM METRO.dbo.IV00101 cogs
LEFT JOIN METRO.dbo.IV00103 vin
on vin.ITEMNMBR = cogs.ITEMNMBR
AND vin.VENDORID = '90505EP'
WHERE
cogs.IVCOGSIX = 137
连接谓词vin.VENDORID='90505EP'有效地将左连接转换为内部连接 试试这个
SELECT
cogs.ITEMNMBR,
vin.VNDITNUM
FROM METRO.dbo.IV00101 cogs
LEFT JOIN METRO.dbo.IV00103 vin
on vin.ITEMNMBR = cogs.ITEMNMBR
AND vin.VENDORID = '90505EP'
WHERE
cogs.IVCOGSIX = 137
您需要左外部联接,因此左表将输出完整内容:
选择
cogs.ITEMNMBR,
vin.VNDITNUM
来自METRO.dbo.IV00101齿轮
左外连接METRO.dbo.IV00103 vin
在vin.ITEMNMBR=cogs.ITEMNMBR上
哪里
cogs.IVCOGSIX=137
并且vin.VENDORID='90505EP'
您需要一个左外部联接,因此左表将输出完整内容:
选择
cogs.ITEMNMBR,
vin.VNDITNUM
来自METRO.dbo.IV00101齿轮
左外连接METRO.dbo.IV00103 vin
在vin.ITEMNMBR=cogs.ITEMNMBR上
哪里
cogs.IVCOGSIX=137
vin.VENDORID='90505EP'
为了解释发生了什么,本质上SQL Server将首先将表连接在一起,然后对结果运行where子句(这比这要复杂一些,但这是它的一般工作方式)。最初运行WHERE子句时,它将删除任何没有vin.VENDORID='90505EP
'的内容,基本上从结果集中去掉空值。并返回内部联接的结果
@SeanLange的回答通过将VENDORID上的过滤器转移到join子句中来解决这个问题,本质上说是“filter dbo.IV00103,其中VENDORID='90505EP,然后在该结果上保留外部连接”
我调用(以前也见过它这样调用)作为一个意外的内部联接。为了解释发生了什么,本质上SQL Server将首先将表联接在一起,然后对结果运行where子句(这比这要复杂一些,但这是它的一般工作方式)。最初运行WHERE子句时,它将删除任何没有
vin.VENDORID='90505EP
'的内容,基本上从结果集中去掉空值。并返回内部联接的结果
@SeanLange的回答通过将VENDORID上的过滤器转移到join子句中来解决这个问题,本质上说是“filter dbo.IV00103,其中VENDORID='90505EP,然后在该结果上保留外部连接”
我调用(以前也见过它这样调用)作为一个意外的内部联接。添加关键字OUTER对这个查询的输出没有任何影响关于
cogs.ITEMNMBR,vin.VNDITNUM FROM METRO.dbo.IV00101 cogs LEFT OUTER JOIN METRO.dbo.IV00103 vin on vin.ITEMNMBR=cogs.ITEMNMBR,其中cogs.IVCOGSHIM=137和(vin.VENDORID='90505EP'或vin.VENDORID为NULL)
添加关键字OUTER对此查询的输出没有任何影响关于cogs.ITEMNMBR,vin.VNDITNUM FROM METRO.dbo.IV00101 cogs LEFT OUTER JOIN METRO.dbo.IV00103 vin on vin.ITEMNMBR=cogs.ITEMNMBR,其中cogs.IVCOGSIX=137和(vin.VENDORID='90505EP'或vin.VENDORID为NULL)
似乎是这样做的,但出于某种原因,我的输出现在是558行对559行。。。我们将做更多的研究来解释为什么会发生这种情况。谓词将左连接变为内部连接的原因是什么?如果要在Where子句中从右表中查找值。这会导致内部连接。好的。。。我认为有人在同一时间对前端进行了更改,这导致了一些问题。但现在行数相等。感谢您的帮助,似乎可以做到这一点,但由于某种原因,我的输出现在是558行对559行。。。我们将做更多的研究来解释为什么会发生这种情况。谓词将左连接变为内部连接的原因是什么?如果要在Where子句中从右表中查找值。这会导致内部连接。好的。。。我认为有人在同一时间对前端进行了更改,这导致了一些问题。但现在行数相等。谢谢你的帮助谢谢你的解释。绝对有帮助。谢谢你的解释。绝对有用。是SQL Server还是MySQL?数据库名dbo
通常是SQL Server,那么为什么您有mysql
标签?@Barmar SQL Server。对不起,出于某种原因,我认为SQL Server的语言是MySQL,是SQL Server还是MySQL?数据库名dbo
通常是SQL Server,那么为什么您有mysql
标签?@Barmar SQL Server。对不起,出于某种原因,我认为SQLServer的语言是MySql