我可以将表名包含在SQL查询结果中吗?

5
如果我有两个表格:
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列的项目在这两个表中是唯一的,但名称不是。


糟糕的数据库设计或者不好的样本。同一个人可以是演员和歌手。 - Viktor Jevdokimov
2
告诉百老汇的人们这件事 - Yannick Motton
1
似乎没有人真正回答这个问题。所有的回复都没有使用表名,而是使用了恰好相同的常量。 - John McAleely
6个回答

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

或者类似这样的内容。


1
我接受这个答案,但我注意到它实际上并没有回答问题。表名不会出现在结果中,而是有一个恰好相同的常量。我假设我的实际问题无法用SQL回答。 - John McAleely

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

1
这只是小问题,但如果您不需要删除重复项,则应使用UNION ALL。 - Dave Costa
这不是挑剔。你说得完全正确。如果在(Id,Name)上有唯一约束,则 UNION ALL 会有效地产生与 UNION 相同的结果,但速度更快。但老实说,在这种情况下我不会关心重复记录。 - Yannick Motton

4

好的,有两个人比我更快地发布了我要发布的示例查询。

但是,我认为对于你的根本问题来说,更好的答案是,如果“职业”是您的数据中相关的属性,并且预计ID是唯一的,请为其创建一个具有实际列的表格,这样做为何不好呢?


+1 虽然其他人(包括我已经删除的回答)都回答了问题,但这个回答实际上是最好的。 - Viktor Jevdokimov
1
规范化是为傻瓜准备的 :p 这是回答问题和解决问题之间的永恒抉择 :) - Yannick Motton
这是一个更大问题的一部分,为了在SO上提问而简化。我正在尝试找出一种最小程度干扰的方法来添加一个小功能。 - John McAleely

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

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
                            WHERE NOT TABLE_NAME = @t1)

DECLARE @SQLcommand nvarchar(400)

SET @SQLcommand = 'select ID, '+ @t1 +' as Career, Name from ' + @t1 +
                  ' union all select ID, '+ @t2 +' as Career, Name from ' +@t2

EXEC(@SQLcommand)

我同意上面的观点,设计确实需要重新审视,才会需要这个。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接