加入表格中的一个项目

时间:2017-01-12 20:53:00

标签: sql sql-server

我有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

3 个答案:

答案 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))

要了解它是如何工作的,请从上一个查询开始:

  • 从table1中选择不同的名称获取所有名称的列表 表1
  • 从table2中选择状态代码,其中...中的名称使用该列表 选择StateCodes

  • 从表3中选择*,其中...中的状态代码从中提取记录 table1与那些州代码。

如果要使用Where子句选择特定名称,请将其添加到最里面的查询中。