gpt4 book ai didi

sql - 为什么多表连接会产生重复的行?

转载 作者:行者123 更新时间:2023-12-03 09:48:04 24 4
gpt4 key购买 nike

假设我有三个表 A、B 和 C。每个表都有两列:一个主键和一些其他数据。它们每个都有相同的行数。如果我 JOIN A 和 B 在主键上,我应该得到与它们中任何一个相同的行数(而不是 A.rows * B.rows)。

现在,如果我 JOIN A JOIN BC ,为什么我会得到重复的行?我曾多次遇到这个问题,但我不明白。似乎它应该产生与 JOIN 相同的结果ing AB因为它具有相同的行数,但会产生重复项。

产生这样的结果的查询的格式是

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,

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

最佳答案

如果其中一张表 M , S , D , 或 H给定的 Id 有不止一行(如果只有 Id 列不是主键),那么查询将导致“重复”行。如果 Id 有多于一行在表中,其他唯一标识行的列也必须包含在 JOIN 条件中。

引用文献 :

Related Question on MSDN Forum

关于sql - 为什么多表连接会产生重复的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23786401/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com