假设我有三个表A,B和C。每个表都有两列:主键和其他一些数据。它们每个具有相同的行数。如果JOIN主键上的IA和B,则我应该得到与其中任一行相同的行数(而不是A.rows * B.rows)。
JOIN
现在,如果我JOIN A JOIN B使用C,为什么我最终会出现重复的行?我有几次遇到这个问题,我不理解。似乎它应该产生与JOINing相同的结果,A并且B由于它具有相同的行数,但是会产生重复项。
A JOIN B
C
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包含一个历史表,其中包含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,
我最初没有发布表格和查询,因为我对自己了解这个问题并在将来避免出现这个问题更感兴趣。
如果表中的一个M,S,D,或H拥有多个行对于给定的Id(如果只是Id列不是主键),然后将导致“重复”行查询。如果Id表中的一行有多个行,则将唯一标识一行的其他列也必须包含在JOIN条件中。
M
S
D
H
Id
参考文献 :
MSDN论坛上的相关问题