2009-10-08 113 views
1

如果我有两个表:我可以在SQL查询的结果中包含表名吗?

Actor: 
ID | Name 
1 : Patrick 
3 : Emma 
7 : Vanessa 

Singer: 
ID | Name 
4 : Will 
5 : Madonna 
13 : Emma 

我可以生成从SQL查询,其中包含每个记录来自表的名称如下表?

ID | Career | Name 
1 : Actor : Patrick 
3 : Actor : Emma 
4 : Singer : Will 
5 : Singer : Madonna 
7 : Actor : Emma 
13 : Singer : Emma 

我假设ID列的项目在两个表中是唯一的,但不是名称。

+0

坏数据库设计或坏样本。同一个人可以是演员和歌手。 – 2009-10-08 13:10:31

+2

告诉那百老汇 – 2009-10-08 13:12:52

+0

chortle chortle。 – 2009-10-10 10:37:10

回答

13
select ID, 'Actor' as Career, Name from Actor 
union all 
select ID, 'Singer' as Career, Name from Singer 

或沿着这些线。

+0

我接受这个答案,但我注意到它并没有真正回答这个问题。 *表名*没有出现在结果中,而是有一个常数恰好相同。我假设我的实际问题无法在SQL中得到解答。 – 2009-10-16 13:29:32

4
SELECT ID, 'Actor' AS Career, Name FROM Actor 
UNION 
SELECT ID, 'Singer' AS Career, Name FROM Singer 
+1

这是一个挑逗,但你应该使用联盟,如果你不需要删除重复。 – 2009-10-08 13:02:29

+0

这不是一个挑逗。你完全正确。如果(Id,Name)有一个唯一约束,UNION ALL将有效地产生与UNION相同的结果,但速度更快。但说实话,我不会在意这种情况下的重复记录。 – 2009-10-08 13:08:44

2

既然你知道你查询从表名,你可以简单地包括在结果文本值设置表名:

SELECT ID, 'Actor', Name FROM Actor 
    UNION SELECT ID, 'Singer', Name FROM Singer; 
2

尝试:

select id, 'Actor' as Career, Name 
from Actor 
union 
select id, 'Singer' as Career, Name 
from Singer 
4

好的,两个人打败了我发布的示例查询。

但是,我认为对根问题的更好回答是,如果“职业”是数据中的相关属性,并且ID预计是唯一的,那么为什么不能有一张表中的职业是实际列?

+0

+1虽然其他人,正如我(已删除),被问到的答案,实际上,这是最好的答案。 – 2009-10-08 13:07:13

+1

规范化适用于吸盘:p这是回答问题或解决问题之间的永恒折衷:) – 2009-10-08 13:11:05

+0

它是一个较大问题的一部分,为了在SO上提出问题而减少。我试图找出添加次要功能的最小破坏性方式。 – 2009-10-10 10:39:57

0

这并不理想,但它确实回答了你的问题,假设数据库只有两个表。

DECLARE @ T1为nvarchar(10)=(SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES) DECLARE @ T2为nvarchar(10)=(SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES其中不TABLE_NAME = @ T1)

declare @SQLcommand nvarchar(400)

set @SQLcommand ='select ID,'+ @ t1 +'as Career,Name from'+ @ t1 +'union all select ID,'+ @ t2 +'as Career ,来自'+ @ t2的姓名

exec(@SQLcommand)

我同意上面的设计确实需要看着你需要这个。

相关问题