gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 15:26:44 25 4
gpt4 key购买 nike

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

现在,如果我 JOIN A JOIN BC,为什么最终会出现重复的行?我多次遇到这个问题,但我不明白。看起来它应该产生与 AB 进行 JOIN 相同的结果,因为它具有相同的行数,但相反,重复项是已制作。

产生这样的结果的查询具有以下格式

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,

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

最佳答案

当您有相关表时,您通常会存在一对多或多对多关系。因此,当您连接到 TableB 时,TableA 中的每条记录在 TableB 中都有多个记录。这是正常现象,也是意料之中的。

现在,有时您只需要某些列,并且所有记录的这些列都是相同的,那么您需要执行某种分组依据或不同的操作来删除重复项。让我们看一个例子:

TableA
Id Field1
1 test
2 another test

TableB
ID Field2 field3
1 Test1 something
1 test1 More something
2 Test2 Anything

因此,当您加入他们并选择您获得的所有文件时:

select * 
from tableA a
join tableb b on a.id = b.id

a.Id a.Field1 b.id b.field2 b.field3
1 test 1 Test1 something
1 test 1 Test1 More something
2 another test 2 2 Test2 Anything

这些不是重复的,因为即使前面的字段中有重复的值,Field3 的值也不同。现在,当您仅选择某些列时,相同数量的记录将连接在一起,但由于具有不同信息的列未显示,因此它们看起来像是重复的。

select a.Id, a.Field1,  b.field2
from tableA a
join tableb b on a.id = b.id

a.Id a.Field1 b.field2
1 test Test1
1 test Test1
2 another test Test2

这似乎是重复的,但并不是因为 TableB 中有多个记录。

通常,您可以通过使用聚合和分组依据、使用不同或通过在 where 子句中进行过滤来删除重复项来解决此问题。如何解决这个问题取决于您的业务规则是什么、数据库的设计方式以及其中的数据类型。

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

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