正确获取3个表之间的数据

时间:2017-01-12 16:40:15

标签: sql sql-server

我正在努力将表1中的数据链接到表3。我正在使用Microsoft SQL Server。我没有太多的经验,但我的研究和测试,我应该使用加入我相信。 我试图根据表1的名称获取Table3的所有列。此路径应为name to name,statecode为statecode。我怎么能继续这个呢?我还提供了我尝试过的代码。

senario的书面例子:&#34;假设table3中有40行。这些行中的10个具有220的状态代码.Bob居住在状态代码220中。然后它应该在状态代码220的表3中显示10行,因为名称是“Bob&#39;”&#34; < / p>

表1列

name | email | phone

表2列

name | statecode | company

表3列

amount | statecode | average

尝试过的代码

select table3.* 
from table3
inner join table2
on table3.statecode = table2.statecode
inner join table1
on table2.name = table1.name
where table1.name = 'Bob'

3 个答案:

答案 0 :(得分:0)

既然你提到SQL Server我采用了TSQL样式,我就假设这些表与具有通用名称的列相关,这种情况并非如此,但似乎很可能。使用更传统的模式,我希望某些或所有表都有Id列,作为该表的键。然后外键可能被命名为TableId。密钥有一个简单的类型,可能Int32以启用快速索引和约束。

SELECT
            C.[Amount],
            C.[StateCode],
            C.[Average]
    FROM
            [Table1] A
       JOIN
            [Table2] B
                ON A.[Name] = B.[Name]
       JOIN
            [Table3] C
                ON B.[StateCode] = C.[StateCode]
    WHERE
            A.[Name] = N'Bob';

我省略了可选关键字,谁需要它们?我已经包含引用的标识符,例如[],这些是可选的但很好的做法。该案例使用了在MSDN上广泛使用的匹配,并且使用空格是不寻常的和可选的,但我认为这有助于提高可读性。

答案 1 :(得分:0)

您的代码有什么问题?

这是一个(非常小的)重写,应该可以正常工作:

select t1.*, t2.*, t3.*
from 
table1 t1 
join table2 t2 on t1.name = t2.name
join table3 t3 on t2.statecode = t3.statecode
where t1.name = 'Bob';

我明确表示你想要查看所有列,而不仅仅是来自table3的数据 - 而且我提供了一些表别名(t1,t2,t3),我找到了帮助结构我的使用sql。

答案 2 :(得分:0)

首先,您必须记住,当您使用大量记录时,使用字符串字段的连接可能会太慢。所以,如果你可以改变给定表的结构,我会做那样的事情:

表1列

  

IDTable1(主键)|名字|电子邮件|电话

表2列

  

IDTable2(主键)| FK_IdTable1(Table1的外键)|   statecode |公司

表3列

  

IDTable3(主键)| FK_IdTable2(表2的外键)|量   | statecode |平均

然后,您所要做的就是使用Join声明表之间的关系。

select table3.* 
from table3 t3
     inner join table2 t2
on t3.FK_IdTable2= t2.IDTable2
     inner join table1 t1
on t1.IDTable1 = t2.FK_IdTable1
where t1.name = 'Bob'