Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server内部联接创建重复记录_Sql Server_Join - Fatal编程技术网

Sql server SQL Server内部联接创建重复记录

Sql server SQL Server内部联接创建重复记录,sql-server,join,Sql Server,Join,我有两个表,我在它们之间创建了一个内部连接,出于某种奇怪的原因,它返回了我所期望的更多记录 表1中有6条记录,包括“版本1”的2条记录、“版本2”的2条记录和“版本3”的2条记录。表2中有10条记录,包括10条“版本1”记录。如果我在版本字段上对它们进行内部联接,我会认为我只会得到2条记录:表1和表2只匹配“版本1”,其中表1中只有2条 但是,下面的查询返回20条记录(如果我能理解60条记录中的任何一条,如果它转换为交叉连接,这也是错误的): 有人能解释一下发生了什么事吗 我还有另外一组非常相似

我有两个表,我在它们之间创建了一个内部连接,出于某种奇怪的原因,它返回了我所期望的更多记录

表1中有6条记录,包括“版本1”的2条记录、“版本2”的2条记录和“版本3”的2条记录。表2中有10条记录,包括10条“版本1”记录。如果我在版本字段上对它们进行内部联接,我会认为我只会得到2条记录:表1和表2只匹配“版本1”,其中表1中只有2条

但是,下面的查询返回20条记录(如果我能理解60条记录中的任何一条,如果它转换为交叉连接,这也是错误的):

有人能解释一下发生了什么事吗

我还有另外一组非常相似的表格,它们给出了我期望的结果,我看不出有什么不同

下面是基本的表结构和数据

CREATE TABLE [dbo].[Table1] (
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [VersionKey] [int] NULL,
    CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED ([ID] ASC)
    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[Table2] (
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [VersionKey] [int] NULL,
    CONSTRAINT [PK_Table2] PRIMARY KEY CLUSTERED ([ID] ASC) 
    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

INSERT INTO [Table1] (VersionKey)
    SELECT 1 UNION ALL
    SELECT 1 UNION ALL
    SELECT 2 UNION ALL
    SELECT 2 UNION ALL
    SELECT 3 UNION ALL
    SELECT 3
GO

INSERT INTO [Table2] (VersionKey)
    SELECT 1 UNION ALL
    SELECT 1 UNION ALL
    SELECT 1 UNION ALL
    SELECT 1 UNION ALL
    SELECT 1 UNION ALL
    SELECT 1 UNION ALL
    SELECT 1 UNION ALL
    SELECT 1 UNION ALL
    SELECT 1 UNION     
    SELECT 1
GO

您的安装脚本有一个bug

INSERT INTO [Table2] (VersionKey)
    SELECT 1 UNION ALL
    SELECT 1 UNION ALL
    SELECT 1 UNION ALL
    SELECT 1 UNION ALL
    SELECT 1 UNION ALL
    SELECT 1 UNION ALL
    SELECT 1 UNION ALL
    SELECT 1 UNION ALL
    SELECT 1 UNION      
    SELECT 1
最后的
UNION
必须是
UNION ALL
,否则您将删除重复项,只插入1行而不是10行

这里是SEDE上的固定脚本和查询结果

它返回20行,这是预期的并且是正确的

从逻辑上讲,将左表中的每一行与右表中的每一行进行比较。如果联接谓词的计算结果为true,则保留匹配

如果内部连接谓词始终为true,例如
On 1=1
左侧的每一行都会成功匹配右侧的每一行,因此您只需使用交叉连接即可


在您的例子中,表1中VersionKey为1的两行与表2中的10行匹配,因此它们一起贡献了20行。表1中的其余行未成功加入任何内容并贡献0行。

以上归功于Martin,但为了澄清以下其他行的答案

正如上面其他人雄辩地解释的那样(再次感谢您的帮助),结果是正确的,以我的例子来说,它应该产生20条记录。然而,这是关于为什么会发生的解释,这是我最初的问题

出现重复记录的原因是,要加入的表在要加入的字段中有重复记录

这就解决了为什么我在其他分别包含2100条和3条记录的表中没有看到这一点的谜团。有3条记录的表中没有重复项,因此最终查询结果中没有重复项

您通常看不到这一点的原因是,与我在这里所做的相比,您可能通常将索引主键字段像ID字段一样连接起来。在这些情况下,因为这些记录值可能总是唯一的,所以您永远不会得到重复的记录

再次感谢大家的帮助

这是我从上面更正的代码,修复了错误以重现结果

CREATE TABLE [dbo].[Table1] (
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [VersionKey] [int] NULL,
    CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED ([ID] ASC)
    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[Table2] (
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [VersionKey] [int] NULL,
    CONSTRAINT [PK_Table2] PRIMARY KEY CLUSTERED ([ID] ASC) 
    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

INSERT INTO [Table1] (VersionKey)
    SELECT 1 UNION ALL
    SELECT 1 UNION ALL
    SELECT 2 UNION ALL
    SELECT 2 UNION ALL
    SELECT 3 UNION ALL
    SELECT 3
GO

INSERT INTO [Table2] (VersionKey)
    SELECT 1 UNION ALL
    SELECT 1 UNION ALL
    SELECT 1 UNION ALL
    SELECT 1 UNION ALL
    SELECT 1 UNION ALL
    SELECT 1 UNION ALL
    SELECT 1 UNION ALL
    SELECT 1 UNION ALL
    SELECT 1 UNION ALL   
    SELECT 1
GO

SELECT * FROM TABLE2 T2 INNER JOIN TABLE1 T1 on T2.VersionKey = T1.VersionKey

好啊韦里德。额外评论。我刚刚在一个全新的数据库中完成了上述操作,结果正如我所料。但在我现有的数据库中,它仍然不正确。是否有需要刷新或刷新的内容?对于所显示的数据,20行是预期的正确结果。内部联接正在主节点上创建1对1,其中有2个匹配项。所以,2x10=20。如果您不想要重复项,您可能需要对它们进行分组,选择“唯一”等。对不起,这没有意义。我刚刚用上面的脚本创建了一个全新的数据库,它返回了2条记录。这是我所期望的,因为我认为内部连接应该只返回匹配的记录。。。不对其匹配的主表中的记录执行交叉联接。同样,我还有一个结构非常相似的表:表2有2160条记录,表1有3条。表1中的所有三条记录都与表2中的记录相匹配。结果返回2160-不是很多(比如3x2160)@ptownbro,这是因为您的安装脚本有一个bug,根本没有在表2中插入10行。正如我上面所说的。。。这没有道理。我刚刚用上面的脚本创建了一个全新的数据库,它返回了2条记录。因此,在我当前的数据库中,必须有其他原因导致不同的结果。另请参见我在上面对另一个回复的评论。我100%同意Martins的优秀总结,并且我能够根据提供的样本数据和Martin建议的表2更改重现您看到的结果。正确。谢谢你的帮助。
CREATE TABLE [dbo].[Table1] (
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [VersionKey] [int] NULL,
    CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED ([ID] ASC)
    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[Table2] (
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [VersionKey] [int] NULL,
    CONSTRAINT [PK_Table2] PRIMARY KEY CLUSTERED ([ID] ASC) 
    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

INSERT INTO [Table1] (VersionKey)
    SELECT 1 UNION ALL
    SELECT 1 UNION ALL
    SELECT 2 UNION ALL
    SELECT 2 UNION ALL
    SELECT 3 UNION ALL
    SELECT 3
GO

INSERT INTO [Table2] (VersionKey)
    SELECT 1 UNION ALL
    SELECT 1 UNION ALL
    SELECT 1 UNION ALL
    SELECT 1 UNION ALL
    SELECT 1 UNION ALL
    SELECT 1 UNION ALL
    SELECT 1 UNION ALL
    SELECT 1 UNION ALL
    SELECT 1 UNION ALL   
    SELECT 1
GO

SELECT * FROM TABLE2 T2 INNER JOIN TABLE1 T1 on T2.VersionKey = T1.VersionKey