如何在SQL中删除/重命名重复的列(而不是重复的行)

6

在尝试从Sybase到Microsoft SQL进行OPENQUERY时,我遇到了一个错误:

通过OPENQUERY和OPENROWSET获得的结果集中不允许有重复的列名。列名“PatientID”是一个重复项。

我构建的查询基于相似的admissionID和patientID连接了2个表。

例如:

PatID   AdmID   Loc  PatID  AdmID   Doctor 
1         5      NC    1      5      Smith 
2         7      SC    2      7      Johnson

当然,真正的查询内容肯定比这多得多。

有没有好的方法可以重命名或删除其中一个AdmID和PatID列?

我尝试过:

SELECT * INTO #tempTable
ALTER #tempTable
DROP COLUMN PatID

这个不起作用,因为PatID存在歧义。

我还尝试了以下方法:

SELECT firstTable.PatID as 'pID', * FROM...

这也不起作用。

7
不要使用邪恶的 "SELECT *"。 - Strawberry
@Politank-Z 它与那个问题有什么重复之处? - Mark Sinkinson
@MarkSinkinson 对不起,是我犯了错误。我把列和行搞混了。 - Politank-Z
我尝试了“firstTable.patID as pID, * FROM...”,它只是在前面添加了一个新列,但后面的列中仍然重复出现了patID。 - Nonpareil
1
@srutzky 当我写那段代码的时候,我没有注意到他用了 "table2." 而不仅仅是 "",因为我很少见到这种方法。你们两位提供的方法都可以,我只是以为可能有一种内置的方法,而不是命名每个单独的列。谢谢。 - Nonpareil
显示剩余6条评论
3个回答

3

在结果集中允许存在重复和缺失的列名,但在表定义中不允许(尽管根据错误消息,似乎即使在这种情况下,它们也不会被允许出现在结果集中)。因此,如果出现这些情况之一,您不能使用 SELECT * 构造。您需要指定字段以便控制它们在结果集中出现的字段名。

SELECT *
INTO   #TempTable
FROM   OPENQUERY('SELECT tab1.Field1, tab1.Field2, tab2.Field12...');

3

你需要给两个重复的列中的其中一个设置别名,并且在至少一个表的select语句中明确指出具体的列(使用了别名的那个表的列):

 SELECT firstTable.PatID as 'pID', firstTable.column2, secondTable.* FROM...

注意,我在第二个表上仍然使用了通配符。
然而...
我建议尽量避免使用*通配符,并始终指定您需要的确切列。

3
这是准确但不幸的解决方案。我认为楼主和我都希望有一些神奇的黑客技巧来避免打一百个列名哈哈哈... - Hack-R

0

我也遇到了这个问题,由于两个表中有许多列,我不确定我需要哪些或有多少重复的列,因此无法将它们全部打出来。

无论如何,我已经找到了一个有点不太优雅但有效的解决方案,应该适用于你描述的上述示例。似乎在普通SQL中,重复的列名不是问题,只是在打开查询部分。所以我运行了相同的查询两次,从第一个表中选择所有内容,然后从第二个表中选择所有内容,将两者都转储到临时表中,然后在临时表的连接上进行了全选:

Select * into #T1 from OPENQUERY(TOAD, 
'select T1.* from t1, t2 where T1.ID = T2.ID')

Select * into #T2 from OPENQUERY(TOAD, 
'select T2.* from t1, t2 where T1.ID = T2.ID')

select * from #T1 inner join #T2 where #T1.ID = #T2.ID

drop table #T1
drop table #T2

希望这可以帮到你!


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