在SQL中将表连接到自身并保存结果

时间:2013-08-14 22:39:42

标签: sql join

在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附加每个列名吗?

2 个答案:

答案 0 :(得分: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
)

如果你有更多的colums怎么办?好的,你可以在JOIN中显示其中一个表

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

抱歉我的英语不好!我希望这可以帮到你!

答案 1 :(得分:0)

我建议您查询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')