我有3个表正在连接(表1,表2和表3)。可以说table3中有40行。这些行中的10个具有220的状态代码.Bob居住在状态代码220中。然后它应该在状态代码220的表3中显示10行,因为名称是“Bob”。在table1和table3之间链接的表是name& statecode。我已经提出了这个查询但是如果表A中有多个Bob记录则会出现问题。这会导致它显示重复的行。我怎么能解决这个问题,以便只有一个Bob名称被用作bobs状态代码是220?我正在使用Microsoft Sql Server
SELECT
C.*
FROM
[Table1] A
JOIN
[Table2] B
ON A.[Name] = B.[Name]
JOIN
[Table3] C
ON B.[StateCode] = C.[StateCode]
WHERE
A.[Name] = 'Bob';
如何设置每个表:
表1列
name | email | phone
表2列
name | statecode | company
表3列
amount | statecode | average
答案 0 :(得分:1)
我发现你实际上没有使用A
中的任何其他属性;那么您的查询也可能如下所示,其中表Bob
中的重复A
根本未被考虑:
SELECT
C.*
FROM
[Table2] B
JOIN
[Table3] C
ON B.[StateCode] = C.[StateCode]
WHERE
B.[Name] = 'Bob';
如果表格B
包含多个Bob
,或者表格C
包含多个带有C.StateCode=220
的条目,您仍然可能会收到重复项;但这不是你问题的一部分。
答案 1 :(得分:0)
您可以使用区别,但在这种情况下我不建议使用该选项。 您不应该依赖名称来加入两个表,并且您应该有一个主键,因为名称不是唯一的。 是否可以更改表结构并添加一些有用的列?
答案 2 :(得分:0)
如果表中有重复记录,则连接将复制输出;这才是他们的工作方式。
同意KD的最佳做法是保持密钥的独特性;但是,使用子查询而不是连接可能是一种解决方法:
select * from Table3
where StateCode in (select StateCode from table2
where Name in (select Name from table1))
要了解它是如何工作的,请从上一个查询开始:
从table2中选择状态代码,其中...中的名称使用该列表 选择StateCodes
从表3中选择*,其中...中的状态代码从中提取记录 table1与那些州代码。
如果要使用Where子句选择特定名称,请将其添加到最里面的查询中。