【问题标题】:Joining a table onto itself in SQL and saving the result在 SQL 中将表连接到自身并保存结果
【发布时间】:2013-08-14 22:39:41
【问题描述】:

在 SQL 中,我将一个表加入到自身中:

SELECT * FROM table AS a
LEFT JOIN table AS b
ON a.NAME = b.NAME

所以它会获取在另一个表的一行中出现的所有具有相同NAME 的行(也将返回同一行两次!)。

假设我想将结果保存到一个临时表中,比如:

SELECT * INTO ##temp_table FROM (
    SELECT * FROM table AS a
    LEFT JOIN table AS b
    ON a.NAME = b.NAME
)

哦,亲爱的。 SQL 说:

The column 'NAME' was specified multiple times.

原因:SQL 只能在每个列名都是唯一的情况下才能创建表。

明显的解决方案:给“第二个表”中的每个列名一个别名。

我的问题是我正在使用的实际表有大约 40 列。为这些列中的每一列赋予别名似乎是在浪费时间。当然,我不需要 每个 列,因此可以删除其中的一些列,但现在决定我需要哪些列似乎也很浪费。

问题:有没有一种简单的方法可以重命名每一列?例如,我可以在每个列名后附加_2_a吗?

【问题讨论】:

  • 您的问题的答案基本上是“否”。您可以将列列表放入Excel中,并使用Excel函数对其进行修改(您可以通过INFORMATION_SCHEMA.COLUMNS获取列表)。

标签: sql join


【解决方案1】:

好的,你有一个查询,有 2 个连接的表,它返回两个表列(我不在乎你是否连接同一个表)。

所以你有两个可能的结果

显示两个列,具有不同的别名 (AS)

SELECT * INTO ##temp_table FROM (
    SELECT a.Name AS NameA, b.Name AS NameB FROM table AS a
    LEFT JOIN table AS b
    ON a.NAME = b.NAME
)

或者,如果您不希望它们重复(因为另一个会返回两次相同的名称)

SELECT * INTO ##temp_table FROM (
    SELECT a.Name FROM table AS a
    LEFT JOIN table AS b
    ON a.NAME = b.NAME
)

如果你有更多的列怎么办?好的,您可以只显示 JOIN 中的一张表

SELECT * INTO ##temp_table FROM (
    SELECT b.* FROM table AS a
    LEFT JOIN table AS b
    ON a.NAME = b.NAME
)

对不起我的英语不好!希望对你有帮助!

【讨论】:

    【解决方案2】:

    我建议查询sys.tablessys.columns 以快速获取重命名的字段:

    SELECT c.name + '_2,' ColumnName
    FROM sys.columns c 
    JOIN sys.tables t 
      ON c.object_id = t.object_id  
    WHERE t.name = 'YourTable'
    

    或者你可以结合OBJECT_ID()函数:

    SELECT c.name + '_2,' ColumnName
    FROM sys.columns c 
    WHERE object_id = OBJECT_ID('YourTable')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-02
      • 1970-01-01
      • 1970-01-01
      • 2019-08-15
      • 1970-01-01
      • 2014-10-17
      • 1970-01-01
      • 2016-08-11
      相关资源
      最近更新 更多