2012-06-01 113 views
2
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 

我们需要得到输出数据为empid, Fname, Lname, Hair, Race; 其中hairrace不作为代码显示,但描述形成代码表。TSQL加入查询

我初学者sql.Can请你帮忙写一个查询 我没有得到每一个期望的输出下面的查询

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) 

回答

5

你应该加入你的码表两次:

  • 一次弄头发
  • 一次拿到比赛

SQL语句

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' 

注意,如果其中一方可能是NULL,你想改变INNER JOINLEFT OUTER JOIN


说,我会建议你为头发和比赛创建一个单独的代码表

试图将所有内容转储到一个代码表中只会让人们感到困惑,并且迫使您最好编写不理想的查询。您强制自己将该类型添加到代码表以及您将创建的每个连接中。

一个更好的选择将是

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 

您将获得更好的性能和一个免费的占地面积更小。

+0

感谢利芬的数据,我越来越希望用第二种方法的结果,但是当我使用一个代码表包括头发和种族的描述我不是获得预期记录。 – David

+0

@David - 我的声明中有错误。我使用'c1.type ='race''而不是'c2.type ='race'' *(另一个使用两个表的原因是:)*。我已经解决了我的答案。你可以试试[在这里](http://data.stackexchange.com/stackoverflow/query/edit/71491) –

+1

@Lieven:另一个使用更有意义别名的理由! :)至少,'ch'而不是'c1'和'cr'而不是'c2' *可能会使这种错误的可能性降低。但我只是唠叨,另外,我自己实际上是内疚的。 :) +1一个很好的解决方案和一个非常好的建议。 –

2

你可以参加两次以获得您所需要

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') 
+0

你也忘了添加'type'到你的连接条件。 –

+0

谢谢@Lieven。更正 –