如何在 SQL 服务器中执行 SELECT * 以同时获取具有 table 名称和字段的别名
How to perform SELECT * in SQL Server to get alias with table name and field at the same time
是否可以使用 SELECT *
或类似的一些简单方法在别名中获取 table 名称以及字段名称?
不同 table 中字段的名称相同。
CREATE TABLE table1 (field1 INT, field2 INT)
CREATE TABLE table2 (field1 INT, field2 INT)
CREATE TABLE table3 (field1 INT, field2 INT)
如果我运行一个SELECT *
命令
SELECT *
FROM table1, table2, table3
我得到了这种结果(示例数据仅显示第一行):
field1 field2 field1 field2 field1 field2
-----------------------------------------
1 1 1 1 2 1
但我想得到这个:
table1.field1 table1.field2 table2.field1 table2.field2 table3.field1 table3.field2
-----------------------------------------------------------------------------------
1 1 1 1 2 1
在此示例中,我可以使用别名更快地更好地识别不同的值 table3.field1
注意:
我不需要将 SELECT * FROM
更改为 SELECT table1.*, table2.*, table3.* FROM
。在真实情况下,我有近 20-30 个不同的 table,每个字段都有近 10 个字段。所以对我没用。
我相信这只能使用基于 information_schema
构建列列表的动态 SQL 来完成。类似于:
CREATE TABLE table1 (field1 INT, field2 INT)
CREATE TABLE table2 (field1 INT, field2 INT)
CREATE TABLE table3 (field1 INT, field2 INT)
DECLARE @tables TABLE (seq INTEGER IDENTITY(1,1), name SYSNAME)
INSERT @tables VALUES ('table1'), ('table2'), ('table3')
DECLARE @sql NVARCHAR(MAX) =
'SELECT '
+ STUFF((
SELECT ', [' + C.TABLE_NAME + '.' + C.COLUMN_NAME + '] = [' + C.TABLE_NAME + '].[' + C.COLUMN_NAME + ']'
FROM @tables T
JOIN INFORMATION_SCHEMA.COLUMNS C ON C.TABLE_NAME = T.name AND C.TABLE_SCHEMA = 'dbo'
ORDER BY T.seq, C.ORDINAL_POSITION
FOR XML PATH('')
), 1, 2, '')
+ CHAR(10) + 'FROM '
+ STUFF((
SELECT ', [' + T.name + ']'
FROM @tables T
ORDER BY T.seq
FOR XML PATH('')
), 1, 2, '')
INSERT table1 VALUES (1, 2), (3, 4)
INSERT table2 VALUES (5, 6)
INSERT table3 VALUES (7, 8), (9, 10)
PRINT @sql
EXEC (@sql)
DROP TABLE table1
DROP TABLE table2
DROP TABLE table3
生成SQL
SELECT [table1.field1] = [table1].[field1], [table1.field2] = [table1].[field2], [table2.field1] = [table2].[field1], [table2.field2] = [table2].[field2], [table3.field1] = [table3].[field1], [table3.field2] = [table3].[field2]
FROM [table1], [table2], [table3]
输出
table1.field1
table1.field2
table2.field1
table2.field2
table3.field1
table3.field2
1
2
5
6
7
8
1
2
5
6
9
10
3
4
5
6
7
8
3
4
5
6
9
10
FOR XML PATH('')
结构是一种方便的(如果没有混淆)连接结果的方法。 STUFF()
用于剥离第一个 comma/space。如果您使用 dbo
以外的模式,则需要对上述内容进行一些改进才能将其考虑在内。我预计还需要更智能的 JOIN
逻辑。
是否可以使用 SELECT *
或类似的一些简单方法在别名中获取 table 名称以及字段名称?
不同 table 中字段的名称相同。
CREATE TABLE table1 (field1 INT, field2 INT)
CREATE TABLE table2 (field1 INT, field2 INT)
CREATE TABLE table3 (field1 INT, field2 INT)
如果我运行一个SELECT *
命令
SELECT *
FROM table1, table2, table3
我得到了这种结果(示例数据仅显示第一行):
field1 field2 field1 field2 field1 field2
-----------------------------------------
1 1 1 1 2 1
但我想得到这个:
table1.field1 table1.field2 table2.field1 table2.field2 table3.field1 table3.field2
-----------------------------------------------------------------------------------
1 1 1 1 2 1
在此示例中,我可以使用别名更快地更好地识别不同的值 table3.field1
注意:
我不需要将 SELECT * FROM
更改为 SELECT table1.*, table2.*, table3.* FROM
。在真实情况下,我有近 20-30 个不同的 table,每个字段都有近 10 个字段。所以对我没用。
我相信这只能使用基于 information_schema
构建列列表的动态 SQL 来完成。类似于:
CREATE TABLE table1 (field1 INT, field2 INT)
CREATE TABLE table2 (field1 INT, field2 INT)
CREATE TABLE table3 (field1 INT, field2 INT)
DECLARE @tables TABLE (seq INTEGER IDENTITY(1,1), name SYSNAME)
INSERT @tables VALUES ('table1'), ('table2'), ('table3')
DECLARE @sql NVARCHAR(MAX) =
'SELECT '
+ STUFF((
SELECT ', [' + C.TABLE_NAME + '.' + C.COLUMN_NAME + '] = [' + C.TABLE_NAME + '].[' + C.COLUMN_NAME + ']'
FROM @tables T
JOIN INFORMATION_SCHEMA.COLUMNS C ON C.TABLE_NAME = T.name AND C.TABLE_SCHEMA = 'dbo'
ORDER BY T.seq, C.ORDINAL_POSITION
FOR XML PATH('')
), 1, 2, '')
+ CHAR(10) + 'FROM '
+ STUFF((
SELECT ', [' + T.name + ']'
FROM @tables T
ORDER BY T.seq
FOR XML PATH('')
), 1, 2, '')
INSERT table1 VALUES (1, 2), (3, 4)
INSERT table2 VALUES (5, 6)
INSERT table3 VALUES (7, 8), (9, 10)
PRINT @sql
EXEC (@sql)
DROP TABLE table1
DROP TABLE table2
DROP TABLE table3
生成SQL
SELECT [table1.field1] = [table1].[field1], [table1.field2] = [table1].[field2], [table2.field1] = [table2].[field1], [table2.field2] = [table2].[field2], [table3.field1] = [table3].[field1], [table3.field2] = [table3].[field2]
FROM [table1], [table2], [table3]
输出
table1.field1 | table1.field2 | table2.field1 | table2.field2 | table3.field1 | table3.field2 |
---|---|---|---|---|---|
1 | 2 | 5 | 6 | 7 | 8 |
1 | 2 | 5 | 6 | 9 | 10 |
3 | 4 | 5 | 6 | 7 | 8 |
3 | 4 | 5 | 6 | 9 | 10 |
FOR XML PATH('')
结构是一种方便的(如果没有混淆)连接结果的方法。 STUFF()
用于剥离第一个 comma/space。如果您使用 dbo
以外的模式,则需要对上述内容进行一些改进才能将其考虑在内。我预计还需要更智能的 JOIN
逻辑。