我有一个查询将表连接回自身,以显示在某个窗口内生成重复的订单。
该表返回如下内容:
id | value | note | id | value | note
------------------------------------------------------
01 | abcde | .... | 03 | zyxxx | ....
06 | 12345 | .... | 09 | 54321 | ....
实际上,该表返回超过150列,因此当连接发生时,我最终得到300列。我最终必须手动将150列重命名为" id_Repeat"," value_Repeat"," note_Repeat"等...
我正在寻找一种自动附加的方式" _Repeat"到了含糊不清的专栏。这可能在T-SQL中使用(使用SQL Server 2008),还是我必须使用以下方法手动映射每列:
SELECT [value] AS [value_Repeat]
答案 0 :(得分:0)
这在T-SQL中是不可能的。列将具有其源表中的名称或您指定的任何别名,但无法系统地重命名它们。
对于这样的情况,将它提高一级是值得的:编写一些代码(使用sys.columns
)生成您之后的查询,包括重命名。当您有计算机供您使用时,为什么要为150列手动执行某些操作?
答案 1 :(得分:0)
我能看到这个工作的唯一方法就是构造一些动态SQL(呃!)。我汇总了一个如何运作的快速示例:
CREATE TABLE test1 (id INT, note VARCHAR(50));
CREATE TABLE test2 (id INT, note VARCHAR(20));
INSERT INTO test1 SELECT 1, 'hello';
INSERT INTO test2 SELECT 1, 'world';
DECLARE @SQL VARCHAR(4096);
SELECT @SQL = 'SELECT ';
SELECT @SQL = @SQL + t.name + '.' + c.name + CASE WHEN t.name LIKE '%test2%' THEN ' AS ' + c.name + '_repeat' ELSE '' END + ','
FROM sys.columns c INNER JOIN sys.tables t ON t.object_id = c.object_id WHERE t.name IN ('test1', 'test2');
SELECT @SQL = LEFT(@SQL, LEN(@SQL) - 1);
SELECT @SQL = @SQL + ' FROM test1 INNER JOIN test2 ON test1.id = test2.id;';
EXEC(@SQL);
SELECT @SQL;
DROP TABLE test1;
DROP TABLE test2;
输出是:
id note id_repeat note_repeat
1 hello 1 world