首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >左外联接不按预期工作

左外联接不按预期工作
EN

Stack Overflow用户
提问于 2014-02-20 21:58:50
回答 2查看 191关注 0票数 1

查询#1

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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右侧表)不满足,则在左侧外部联接中,将返回左表中从右侧选择的值的空值。如果我们将一个值从正确的表匹配到一个文字,为什么会有什么不同呢?左边表上的那一行不应该还回来吗?

伙计,我以为这是我写的最基本的东西.

这里是你需要重现我所做的事情:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 2014-02-20 22:19:14

CLIENT表中有一行用于CLIENT_ID = 23721

您可以加入另一个表,该表有多个用于CLIENT_ID = 23721的行(当与第一个查询中的条件相结合时),但是当连接条件被更改时,它从RIGHT表中排除其中一个行。

您将从您的LEFT表中获取所有记录,而不管它们是否与RIGHT表中的记录连接,就像预期的那样。

票数 3
EN

Stack Overflow用户

发布于 2014-02-20 22:08:40

你的理解是正确的。如果筛选器在JOIN的ON子句中,它将不会从第一个表中删除行。

我觉得你需要找其他地方找你的问题..。你真的想在你的'Sales '常量中有一个尾随空间吗?

这里有一个JSFiddle来测试这个:http://sqlfiddle.com/#!2/bfe32/3/0

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21920549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档