【问题标题】:How to remove/rename a duplicate column in SQL (not duplicate rows)如何删除/重命名 SQL 中的重复列(不是重复行)
【发布时间】:2015-07-31 09:12:09
【问题描述】:

尝试从 Sybase 到 Microsoft SQL 执行 OPENQUERY 时遇到错误:

通过获取的结果集中不允许有重复的列名 开放查询和开放式集。列名“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...

这也不起作用。

【问题讨论】:

  • 不要使用邪恶的“SELECT *
  • 请记住以上关于不使用*的信息,您可以尝试firstTable.*, secondTable.*, etc。但是尽量只在你的选择语句中输出你需要的东西。
  • @Politank-Z 以什么方式重复了那个问题?
  • @srutzky 当我放那个时,我错过了他放 table2.* 而不仅仅是 * 因为我没有看到太多这种方法。您的任何一种方法都可以工作,我只是假设除了命名每个单独的列之外,可能还有一种内置方法。谢谢。

标签: sql sql-server sybase


【解决方案1】:

您必须为两个重复列之一设置别名,并至少为其中一个表(您在其列上使用别名的那个)明确指出 select 中的特定列:

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

注意,我仍然在 secondTable 上使用了通配符。

但是....

我会完全避免使用* 通配符,并尝试始终准确地指出您需要的列。

【讨论】:

  • 这是准确但不幸的解决方案。我认为 OP 和我希望有一些奇迹般的技巧来避免输入一百个列名 LOL....
【解决方案2】:

结果集中允许出现重复和缺失的列名,但不允许出现在表定义中(尽管给出了错误消息,但在这种情况下,似乎在结果集中甚至不允许它们出现)。因此,如果发生上述任何一种情况,您就不能使用 SELECT * 构造。您需要指定字段,以便您可以控制在结果集中出现的字段名称。

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

【讨论】:

    猜你喜欢
    • 2019-10-10
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    • 1970-01-01
    • 2021-11-07
    相关资源
    最近更新 更多