TSQL连接查询

TSQL连接查询,sql,tsql,ssis,Sql,Tsql,Ssis,我们需要获得的输出数据为empid、Fname、Lname、Hair、Race; 其中,头发和种族不显示为代码,而是从代码表中进行描述 我是sql的初学者。你能帮我写一个查询吗 我没有得到每个查询的预期输出 Employee Table: Empid FNAme LName Hair Race 1 john adam 1 1 2 clift susanne 2 3

我们需要获得的输出数据为
empid、Fname、Lname、Hair、Race
; 其中,
头发
种族
不显示为代码,而是从代码表中进行描述

我是sql的初学者。你能帮我写一个查询吗 我没有得到每个查询的预期输出

Employee Table:
Empid   FNAme           LName      Hair Race
1       john            adam       1     1
2       clift           susanne    2     3

Code Table:
code  type    description
1     hair    black
2     hair    brown
1     race    black
3     race    white

您应该加入代码表两次:

  • 一次去拿头发
  • 一次去参加比赛
SQL语句

select E.Empid,E.FName,E.Lname,c.description as Hair,c.description as race
From Employee2 E  inner join code c
on (c.code = E.Hair )
请注意,如果其中任何一个可以是
NULL
,则需要将
内部联接更改为
左侧外部联接


尽管如此,我建议您为头发和种族创建一个单独的代码表

试图将所有内容转储到一个代码表中只会让人感到困惑,并迫使您最多只能编写次优查询。您强制自己将类型添加到代码表和您将创建的每个连接中

更好的选择是

SELECT E.EmpID
       , E.FName
       , E.LName
       , c1.Description AS Hair
       , c2.Description AS Race
FROM   Employee E
       INNER JOIN Code c1 ON c1.Code = e.Hair AND c1.type = 'hair'
       INNER JOIN Code c2 ON c2.Code = e.Race AND c2.type = 'race'
把你的陈述简化为

Employee Table:
Empid   FNAme           LName      Hair Race
1       john            adam       1     1
2       clift           susanne    2     3

HairCode Table:
code  description
1     black
2     brown

RaceCode Table:
1     black
3     white

您将免费获得更好的性能和更小的占用空间。

您可以加入两次以获取所需的数据

SELECT E.EmpID
       , E.FName
       , E.LName
       , c1.Description AS Hair
       , c2.Description AS Race
FROM   Employee E
       INNER JOIN HairCode c1 ON c1.Code = e.Hair 
       INNER JOIN RaceCode c2 ON c2.Code = e.Race 

您还忘了将
类型添加到您的联接条件中。谢谢Lieven,我使用第二种方法得到了预期的结果,但当我使用一个包含头发和种族描述的代码表时,我没有得到预期的记录。@David-我的语句中有错误。我使用了
c1.type='race'
而不是
c2.type='race'
(使用两个表的另一个原因是:)。我已经确定了我的答案。你可以试试@Lieven:这也是使用更有意义的别名的另一个原因!:)至少,
ch
而不是
c1
cr
而不是
c2
可能会降低犯错误的可能性。但我只是在唠叨,而且,我自己也很内疚+“一个好的解决方案和一个非常好的建议。”安德烈-我知道,正是因为这个原因,我对桑加的答案投了赞成票。在我的辩护中,我复制了原始查询中的代码,在原始查询中,两个表都被命名为
code
,并且没有麻烦重命名别名。不幸的是,这些东西迟早会咬到你:)
select E.Empid, E.FName, E.Lname, hair.description as Hair, race.description as race 
From Employee2 E  
inner join code hair on (hair.code = E.Hair and hair.type = 'hair' ) 
inner join code race on (race.code = E.Race and race.type = 'race')