在新表SQL SERVER 2008中将SQL列转换为单独的行
我有一个表,其中有一组列,如下所示: ID、Name1、Name2、Name3、Title1、Title2、Title3、Email1、Email2、Email3 joe blow,Jane doe,john doe,总裁,秘书,看门人,no@no.com, yes@no.com,maybe@no.com 我正在尝试拆分为多行,并使用以下列标题插入到新表中: ID、姓名、标题、电子邮件 *1-joe blow,总统,no@no.com 1-Jane doe,秘书,yes@no.com 1-约翰·多伊,看门人,maybe@no.com* 我在网上找不到任何能帮我解决这个问题的信息。仅此表中就有超过4K的条目,因此不可能手动输入在新表SQL SERVER 2008中将SQL列转换为单独的行,sql,sql-server,database-table,Sql,Sql Server,Database Table,我有一个表,其中有一组列,如下所示: ID、Name1、Name2、Name3、Title1、Title2、Title3、Email1、Email2、Email3 joe blow,Jane doe,john doe,总裁,秘书,看门人,no@no.com, yes@no.com,maybe@no.com 我正在尝试拆分为多行,并使用以下列标题插入到新表中: ID、姓名、标题、电子邮件 *1-joe blow,总统,no@no.com 1-Jane doe,秘书,yes@no.com 1-约翰·
每个公司的ID必须相同。意思是所有一行都是一个ID,下一行是另一个ID,等等。工会有什么问题吗
select ID, Name1, Title1, Email1
from table
union all
select ID, Name2, Title2, Email2
from table
union all
select ID, Name3, Title3, Email3
from table
是否始终填充所有列?您可以使用where子句确保填充了name3(其中name3不为null),以确保填充了新表中的所有值。您没有指定正在使用的SQL Server版本,但将多列转换为多行的过程称为UNPIVOT。有几种方法可以在SQL Server中取消填充数据 如果您使用的是SQL Server 2008+,则可以使用带VALUES子句的交叉应用来取消对3组中的列的填充:
select id, name, title, email
from yourtable
cross apply
(
values
(name1, title1, email1),
(name2, title2, email2),
(name3, title3, email3)
) c (name, title, email);
看
如果您使用的是SQL Server 2005+,则可以对UNION ALL使用交叉应用:
select id, name, title, email
from yourtable
cross apply
(
select name1, title1, email1 union all
select name2, title2, email2 union all
select name3, title3, email3
) c (name, title, email);
请参见请通过添加适当的标记(Oracle、SQL Server、MySQL等)来指定您的目标RDBMS。可能有一些答案利用了并非普遍支持的语言或产品功能。此外,通过使用特定的RDBMS标记它,您的问题可能会得到更适合回答它的人的注意。这与C#SQL SERVER有什么关系?我拿出了C#Jeroen,我在这个项目中使用它是为了其他目的。抱歉搞混了。我已经编辑了你的标题。请参阅“”,其中共识是“不,他们不应该”。除了3次表扫描和UNION导致的排序/合并之外?不,并非所有列都会填充。在我试图修复一个先前存在的设计缺陷时,我还希望将它们放在一个新表中。在这些union语句中,可以有一系列where子句来格式化或过滤坏数据。如果您使用的是sql server 2008+,我会使用BlueFoots提供的解决方案……否则,我会使用这个联盟@Panagiotis-是的,效率不高。一个表中有4k行,3次表扫描也不错。