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

现在,如果我JOIN A JOIN BC,为什么我会得到重复的行?我已经多次遇到这个问题,我不理解它.因为它产生的行数应该是相同的,所以它产生的行数应该是相同的.

产生类似结果的查询的格式如下

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,

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

推荐答案

如果表MSDH中的一个对于给定的Id有多行(如果只有Id列不是主键),那么查询将导致"重复"行.如果表中的Id有多个行,那么唯一标识行的其他列也必须包含在联接条件中.

References:

Related Question on MSDN Forum

Sql相关问答推荐

数据子集的左连接

如何使用PostGIS从单个表中 Select 所有相交面组

SQL—如何根据2列填写缺失的值

如何在Presto中将多个列合并到一个数组中

有没有办法在Postgres中存储带有时区的时间戳,而不将其转换为UTC

重用传递给 node 的参数-postgres upsert查询

按两列分组,并根据SQL中的条件返回第三个列值

PostgreSQL-按距离阈值挤压相邻行的性能

如何在T-SQL中编写row_number的WHERE子句?

如何创建snowflake表(动态查找数据类型)并从阶段加载(AWS S3)?

根据标识符将两行合并为一行

Grafana SQL 模板变量(值、文本)

清理 XML 数据

使用SQLAlchemy和Postgres数据库创建新行时,为什么我的创建日期比更新日期晚?

如何在插入时将字符串'03-January-2023'转换为日期时间

PostgreSQL:通过数组的元素从另一个表中 Select 数据,然后按顺序显示

Select 给定类别列表(或更多类别)中的所有事物

SELECT 用于 Parent、Children 和 ORDER BY [Order] 列

面对来自以下两个代码的不同输出

在 SQL 的每行选项中 Select 最大值