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
您应该加入代码表两次:
- 一次去拿头发
- 一次去参加比赛
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')