来自平面文件的SQL查询

时间:2010-01-19 20:23:57

标签: sql select

我有一张表如:

John email1 email2 email3 ...and so on

我需要将数据集转换为这种格式:

John email1
John email2
John email3

如果更容易,它可以导出到Excel并导入。感谢...

4 个答案:

答案 0 :(得分:4)

假设Name,Email1,Email2,Email3是列名:

   Select Name, Email1
    From YourTable
    Where Email1 <> ''
    Union
    Select Name, Email2
    From YourTable
    Where Email2 <> ''
    Union
    Select Name, Email3
    From YourTable
    Where Email3 <> ''

答案 1 :(得分:3)

你是什么意思修复?你可以这样做:

SELECT name+' '+email1 as email1,
       name+' '+email2 as email2, 
       name+' '+email3 as email3, 
       name+' '+email3 as email3, 
       ...
FROM table

以上是在我看到格式化之前编写的......我相信这就是你想要的 - 只在mssqlserver上测试

declare @t table
(
  name varchar(max),
  email1 varchar(max),
  email2 varchar(max),
  email3 varchar(max),
  email4 varchar(max)
)

insert into @t 
 values ('name1a','email1a','email2a','email3a','email4a')
insert into @t  
 values ('name2b','email1b','email2b','email3b','email4b')

 select * from @t

SELECT name, email 
FROM
(
SELECT name, email1, email2, email3, email4
FROM @t) p
UNPIVOT
   (email FOR emails IN 
      (email1, email2, email3, email4)
)AS unpvt

答案 2 :(得分:0)

我认为没有理由“走出去”XLS或其他东西,然后重新导入。

您可以通过

解决问题

1)(只有在认为值得,取决于数据库大小,行数等)时,可能会在表上删除一些索引。

2)运行INSERT查询以添加新行,即从Name和“Emailn”列(以及其他所需列或所需的默认值)创建的行

3)一旦调度了所有“Emailn”列,就改变表模式以删除这些列。

4)重新构建先前删除的索引和/或重新打包其他索引。

具体来说,对于#2,查询(ies)看起来像

INSERT INTO MyTable 
   (Name, Email1, SomeOtherColumn, YetOtherColumn)
   SELECT Name, Email2, someColumn, "ABC"
   FROM MyTable
   WHERE Email2 IS NOT NULL

您可以为Email1之外的每个“Emailn”列执行此操作。等瞧...

只有在桌子很大的时候可能会遇到困难,但是因为你在考虑使用Excel,所以情况可能并非如此。

答案 3 :(得分:0)

彻底检修(我的原始答案是基于该问题的短暂错误版本)。

如果“平面文件”指的是文本文件,那么转换的简单(非SQL)版本将使用awk,例如:

awk "{ for (i = 2; i <= NF; i++ ) { print $1, $i }}" < original.txt