Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用sql连接两个表_Sql_Sql Server - Fatal编程技术网

使用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