查询#1
SELECT
dbo.CLIENT.CLIENT_ID, dbo.CLIENT.GOC, dbo.SALES_UW_REGION.SALES_UNDERWRITING
FROM dbo.CLIENT LEFT OUTER JOIN
dbo.SALES_UW_REGION ON dbo.CLIENT.GOC = dbo.SALES_UW_REGION.GOC
WHERE (dbo.CLIENT.CLIENT_ID = 23721)
CLIENT_ID, GOC, SALES_UNDERWRITING
23721 332 Underwriting
23721 332 Sales我可以理解为什么这只返回一行,原因是,尽管左外部联接确保了两个客户端记录的返回,即使它们是不匹配的,筛选器还是在联接之后应用,因此结果集只有一行。
查询#2
SELECT
dbo.CLIENT.CLIENT_ID, dbo.CLIENT.GOC, dbo.SALES_UW_REGION.SALES_UNDERWRITING
FROM dbo.CLIENT LEFT OUTER JOIN
dbo.SALES_UW_REGION ON dbo.CLIENT.GOC = dbo.SALES_UW_REGION.GOC
WHERE (dbo.CLIENT.CLIENT_ID = 23721)
and SALES_UW_REGION.SALES_UNDERWRITING = 'Sales '
CLIENT_ID GOC SALES_UNDERWRITING
23721 332 Sales但是,如果我将“SALES”筛选器移到JOIN子句,则会暂停以看到仍返回一行。
查询#3
SELECT
dbo.CLIENT.CLIENT_ID, dbo.CLIENT.GOC, dbo.SALES_UW_REGION.SALES_UNDERWRITING
FROM dbo.CLIENT LEFT OUTER JOIN
dbo.SALES_UW_REGION ON dbo.CLIENT.GOC = dbo.SALES_UW_REGION.GOC
and SALES_UW_REGION.SALES_UNDERWRITING = 'Sales '
WHERE (dbo.CLIENT.CLIENT_ID = 23721)
CLIENT_ID GOC SALES_UNDERWRITING
23721 332 Sales由于它是JOIN子句的一部分,而join是左外部的,所以我希望得到2行。通常,如果在两个列上包含相等匹配的联接条件(一个来自左侧表,另一个来自teh右侧表)不满足,则在左侧外部联接中,将返回左表中从右侧选择的值的空值。如果我们将一个值从正确的表匹配到一个文字,为什么会有什么不同呢?左边表上的那一行不应该还回来吗?
伙计,我以为这是我写的最基本的东西.
这里是你需要重现我所做的事情:
CREATE TABLE [dbo].[CLIENT](
[CLIENT_ID] [bigint] NOT NULL,
[GOC] [char](3) NULL
)
go
CREATE TABLE [dbo].[SALES_UW_REGION](
[GOC] [char](3) NOT NULL,
[SALES_UNDERWRITING] [varchar](12) NULL
)
go
INSERT INTO [dbo].[CLIENT]([CLIENT_ID], [GOC])
SELECT 23721, N'332'
go
INSERT INTO [dbo].[SALES_UW_REGION]([GOC], [SALES_UNDERWRITING])
SELECT N'332', N'Underwriting' UNION ALL
SELECT N'332', N'Sales'
go发布于 2014-02-20 22:19:14
CLIENT表中有一行用于CLIENT_ID = 23721。
您可以加入另一个表,该表有多个用于CLIENT_ID = 23721的行(当与第一个查询中的条件相结合时),但是当连接条件被更改时,它从RIGHT表中排除其中一个行。
您将从您的LEFT表中获取所有记录,而不管它们是否与RIGHT表中的记录连接,就像预期的那样。
发布于 2014-02-20 22:08:40
你的理解是正确的。如果筛选器在JOIN的ON子句中,它将不会从第一个表中删除行。
我觉得你需要找其他地方找你的问题..。你真的想在你的'Sales '常量中有一个尾随空间吗?
这里有一个JSFiddle来测试这个:http://sqlfiddle.com/#!2/bfe32/3/0
https://stackoverflow.com/questions/21920549
复制相似问题