【发布时间】:2014-07-10 06:50:53
【问题描述】:
假设我有三个表 A、B 和 C。每个表都有两列:一个主键和一些其他数据。它们每个都有相同的行数。如果我在主键上JOIN A 和 B,我最终应该得到与其中任何一个相同的行数(而不是 A.rows * B.rows)。
现在,如果我 JOIN A JOIN B 和 C,为什么我会得到重复的行?我曾多次遇到这个问题,但我不明白。看起来它应该产生与JOINing A 和B 相同的结果,因为它具有相同的行数,但是会产生重复。
产生这样的结果的查询具有以下格式
SELECT *
FROM M
INNER JOIN S
on M.mIndex = S.mIndex
INNER JOIN D
ON M.platformId LIKE '%' + D.version + '%'
INNER JOIN H
ON D.Name = H.Name
AND D.revision = H.revision
这里是表的架构。 H contains 是一个历史表,其中包含 D 中的所有内容。每个 D 有许多 M 行,每个 M 有一个 S。
表 M
[mIndex] [int] NOT NULL PRIMARY KEY,
[platformId] [nvarchar](256) NULL,
[ip] [nvarchar](64) NULL,
[complete] [bit] NOT NULL,
[date] [datetime] NOT NULL,
[DeployId] [int] NOT NULL PRIMARY KEY REFERENCES D.DeployId,
[source] [nvarchar](64) NOT NULL PRIMARY KEY
表 S
[order] [int] NOT NULL PRIMARY KEY,
[name] [nvarchar](64) NOT NULL,
[parameters] [nvarchar](256) NOT NULL,
[Finished] [bit] NOT NULL,
[mIndex] [int] NOT NULL PRIMARY KEY,
[mDeployId] [int] NOT NULL PRIMARY KEY,
[Date] [datetime] NULL,
[status] [nvarchar](10) NULL,
[output] [nvarchar](max) NULL,
[config] [nvarchar](64) NOT NULL PRIMARY KEY
表 D
[Id] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[branch] [nvarchar](64) NOT NULL,
[revision] [int] NOT NULL,
[version] [nvarchar](64) NOT NULL,
[path] [nvarchar](256) NOT NULL
表 H
[IdDeploy] [int] IDENTITY(1,1) NOT NULL,
[name] [nvarchar](64) NOT NULL,
[version] [nvarchar](64) NOT NULL,
[path] [nvarchar](max) NOT NULL,
[StartDate] [datetime] NOT NULL,
[EndDate] [datetime] NULL,
[Revision] [nvarchar](64) NULL,
我最初没有发布表格和查询,因为我更感兴趣的是自己了解这个问题并在将来避免它。
【问题讨论】:
-
您正在运行的完整查询是什么?
-
这在很大程度上取决于您使用的连接类型。
-
您可能正在进行笛卡尔连接。维基页面有这种和其他类型的连接的例子 - en.wikipedia.org/wiki/Join_(SQL)#Cross_join
-
@sirdank 如果没有您查询的数据的额外样本,这不是一个有用的示例。
-
@MattThrower 这是故意的。我故意询问连接的机制以便更好地理解它们。我想学钓鱼,而不是饿了就向我要鱼。我将发布表定义并更新示例查询。