SQL select join: is it possible to prefix all columns as 'prefix.*'?

后端 未结 22 1825
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-02 06:20

I\'m wondering if this is possible in SQL. Say you have two tables A and B, and you do a select on table A and join on table B:

SELECT a.*, b.* FROM TABLE_A a         


        
22条回答
  •  星月不相逢
    2020-12-02 06:54

    There is no SQL standard for this.

    However With code generation (either on demand as the tables are created or altered or at runtime), you can do this quite easily:

    CREATE TABLE [dbo].[stackoverflow_329931_a](
        [id] [int] IDENTITY(1,1) NOT NULL,
        [col2] [nchar](10) NULL,
        [col3] [nchar](10) NULL,
        [col4] [nchar](10) NULL,
     CONSTRAINT [PK_stackoverflow_329931_a] PRIMARY KEY CLUSTERED 
    (
        [id] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    
    CREATE TABLE [dbo].[stackoverflow_329931_b](
        [id] [int] IDENTITY(1,1) NOT NULL,
        [col2] [nchar](10) NULL,
        [col3] [nchar](10) NULL,
        [col4] [nchar](10) NULL,
     CONSTRAINT [PK_stackoverflow_329931_b] PRIMARY KEY CLUSTERED 
    (
        [id] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    
    DECLARE @table1_name AS varchar(255)
    DECLARE @table1_prefix AS varchar(255)
    DECLARE @table2_name AS varchar(255)
    DECLARE @table2_prefix AS varchar(255)
    DECLARE @join_condition AS varchar(255)
    SET @table1_name = 'stackoverflow_329931_a'
    SET @table1_prefix = 'a_'
    SET @table2_name = 'stackoverflow_329931_b'
    SET @table2_prefix = 'b_'
    SET @join_condition = 'a.[id] = b.[id]'
    
    DECLARE @CRLF AS varchar(2)
    SET @CRLF = CHAR(13) + CHAR(10)
    
    DECLARE @a_columnlist AS varchar(MAX)
    DECLARE @b_columnlist AS varchar(MAX)
    DECLARE @sql AS varchar(MAX)
    
    SELECT @a_columnlist = COALESCE(@a_columnlist + @CRLF + ',', '') + 'a.[' + COLUMN_NAME + '] AS [' + @table1_prefix + COLUMN_NAME + ']'
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME = @table1_name
    ORDER BY ORDINAL_POSITION
    
    SELECT @b_columnlist = COALESCE(@b_columnlist + @CRLF + ',', '') + 'b.[' + COLUMN_NAME + '] AS [' + @table2_prefix + COLUMN_NAME + ']'
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME = @table2_name
    ORDER BY ORDINAL_POSITION
    
    SET @sql = 'SELECT ' + @a_columnlist + '
    ,' + @b_columnlist + '
    FROM [' + @table1_name + '] AS a
    INNER JOIN [' + @table2_name + '] AS b
    ON (' + @join_condition + ')'
    
    PRINT @sql
    -- EXEC (@sql)
    

提交回复
热议问题