admin

为什么多表联接会产生重复的行?

sql

假设我有三个表A,B和C。每个表都有两列:主键和其他一些数据。它们每个具有相同的行数。如果JOIN主键上的IA和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包含一个历史表,其中包含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,

我最初没有发布表格和查询,因为我对自己了解这个问题并在将来避免出现这个问题更感兴趣。


阅读 180

收藏
2021-05-10

共1个答案

admin

如果表中的一个MSD,或H拥有多个行对于给定的Id(如果只是Id列不是主键),然后将导致“重复”行查询。如果Id表中的一行有多个行,则将唯一标识一行的其他列也必须包含在JOIN条件中。

参考文献

MSDN论坛上的相关问题

2021-05-10