【发布时间】:2014-02-20 21:58:50
【问题描述】:
查询 #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
我可以理解为什么这只会返回一行,原因是尽管 LEFT 外连接确保返回两个 CLIENT 记录,即使它们不匹配,但在连接之后应用了 FILTER,因此结果集只有一个行。
查询 #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 子句的一部分,并且连接是 LEFT OUTER,所以我会得到 2 行。一般来说,如果 JOIN 条件涉及两列的相等匹配,一列来自 LEFT 表,另一列来自 RIGHT 表,则在 LEFT OUTER JOIN 中,LEFT 表将返回 NULL 值,用于从对。如果我们将 RIGHT 表中的值与文字匹配,为什么会有任何不同?不应该返回 LEFT 表中的行吗?
伙计,我认为这是我已经掌握的基本内容......
这是你需要重新创建我所做的事情:
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
【问题讨论】:
-
LEFT OUTER JOINS 永远不会按预期运行 :)
-
我相信左表(客户端)只有一条记录,它被重复的次数与右侧的匹配行一样多。当您过滤右表时,无论在哪里,笛卡尔积中的行数都会减少。唯一的例外是当右侧没有行时,您仍然会得到左行 - 这就是为什么存在左连接。
-
你一定是对的,但我觉得奇怪的是,如果我在 LEFT.COL1 = RIGHT.COL2 上执行 LEFT OUTER JOIN,如果 RIGHT 上没有匹配的记录,则 LEFT 行仍然是返回,但如果我替换 LEFT 上的文字,例如 'X' = RIGHT.COL2,那么 RIGHT 上匹配行的存在可能会影响 LEFT 行是否返回。好像不一致
标签: sql sql-server