当前位置: 首页 > 面试题库 >

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

关项明
2023-03-14
问题内容

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

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


问题答案:

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

参考文献

MSDN论坛上的相关问题



 类似资料:
  • 在测试CRC实现时,我注意到0x01的CRC通常(?)似乎是多项式本身。然而,当试图手动进行二进制长除法时,我总是以丢失多项式的前导“1”告终,例如,当消息为“0x01”和多项式“0x1021”时,我将得到 通过查看https://en.wikipedia.org/wiki/computation_of_cyclic_redundancy_checks,我可以看到使用生成多项式离开移位寄存器的高位

  • 问题内容: 在我的项目中,我的一个同事非常反对使用运算符,因为它“会产生大量开销”,这是什么原因呢?是真的吗 还有另一种方法可以检查对象的类型而不使用它? 因为我发现它在某些情况下非常有用。 问题答案: 确实产生一些开销,再加上后续的转换。使用最新版本的Java,开销已减少。但是无论如何,这都是微优化-也就是说,在一般情况下,您不必为此担心。 真正的反对意见是,在许多情况下,有更好的OOP方法可以

  • 我有两个实体帐户和头寸。POSITION表和ACCOUNT表有内容,但我认为至少应该有一行的POSITION_ACCOUNT表是空的。我可能做错了什么?以下是相关代码(我使用Eclipse Link 2.4.2: 就位: @许多私人名单账户; 在帐户: @ManyTo许多(mappdBy="帐户",抓取=FetchType. EAGER,级联=CascateType. PERSIST)@JoinT

  • 我想把一个数组的不同数组元素组合(排列)放到一个列表中。我通过for循环交换数组的第一个和最后一个元素,组合(排列)被添加到列表中。然后,第二个元素和最后一个元素之前的元素被交换并添加到列表中,依此类推。假设数组是,添加到列表中的第一个元素将是。第二个元素是。但我最终得到的是列表中所有元素的。 问题是添加到List中的元素也会随着数组的当前修改而相应地修改。我最终在List中得到了类似的数组元素。

  • 问题内容: 当我与某些IRC服务器(而非其他IRC服务器)建立SSL连接时(大概是由于服务器的首选加密方法),出现以下异常: 最终原因: 演示此问题的服务器示例是(这是一个IRC服务器)。未显示问题的服务器的示例是。[不足为奇的是,每个网络上的所有服务器都共享相同的行为。] 我的代码(如所述,在连接到某些SSL服务器时有效)是: 是最后一个startHandshake引发异常。是的,’trustA

  • 我观察到库函数,当它在循环中被调用一次时,它几乎总是产生正数。