是否可以根据 select+where 的结果为列添加别名?

Rac*_*SQL 6 sql-server-2008 sql-server

我有一张这样的表:

TB1:

COD | A001 | A002 | A003
 1    cars   baby   nasa
Run Code Online (Sandbox Code Playgroud)

然后是第二张桌子:

TB2:

COD | NO_COL_TB1 | DESCRIPTION |
 1  |    A001    |  Something
 2  |    A002    |   lasagna
Run Code Online (Sandbox Code Playgroud)

我正在尝试做的是这样的事情(显然这不起作用)

select A001 as (select description from TB2 WHERE no_col_tb1= A001 )
      ,A002 AS (select description from TB2 WHERE no_col_tb1= A002 )
from TB1
Run Code Online (Sandbox Code Playgroud)

我尝试使用内部连接和一些动态 sql,但我无法思考这个逻辑。有一些关于此的问题,但没有一个可以帮助我。我认为这是不可能用单个语句完成的,只能用动态 SQL 来完成。

编辑:

正确的结果是:

SELECT COD,
       TB1.A001 AS 'Something',
       TB1.A002 AS 'Lasagna'
FROM TB1
Run Code Online (Sandbox Code Playgroud)

结果将是:

COD |SOMETHING | LASAGNA |
 1      cars       baby
Run Code Online (Sandbox Code Playgroud)

Tar*_*ryn 25

很抱歉,但考虑到您想要做什么,您的表结构很难处理。有多种方法可以获得结果,一种方法是使用UNPIVOTand PIVOT,但它很难看。

您可以首先UNPIVOT将数据TB1从列输入到行:

select *
from tb1 t1
unpivot 
(
    val
    for col in (A001, A002, A003)
) u
Run Code Online (Sandbox Code Playgroud)

这将以以下格式返回数据:

| COD |  val |  col |
|-----|------|------|
|   1 | cars | A001 |
|   1 | baby | A002 |
|   1 | nasa | A003 |
Run Code Online (Sandbox Code Playgroud)

然后您可以获取该结果并将其加入TB2

select 
    d.COD,
    d.val,
    t2.DESCRIPTION
from
(
    select *
    from tb1 t1
    unpivot 
    (
        val
        for col in (A001, A002, A003)
    ) u
)d
inner join tb2 t2
    on d.col = t2.NO_COL_TB1;
Run Code Online (Sandbox Code Playgroud)

这给出了结果:

| COD |  val | DESCRIPTION |
|-----|------|-------------|
|   1 | cars |   Something |
|   1 | baby |     lasagna |
Run Code Online (Sandbox Code Playgroud)

现在您在行Descriptionval行中有新的列名,但您希望它们在列中,所以现在您可以将PIVOT函数应用于它:

select *
from
(
    select 
        d.COD,
        d.val,
        t2.DESCRIPTION
    from
    (
        select *
        from tb1 t1
        unpivot 
        (
            val
            for col in (A001, A002, A003)
        ) u
    )d
    inner join tb2 t2
        on d.col = t2.NO_COL_TB1
) x
pivot
(
    max(val)
    for description in (Something, Lasagna)
) p;
Run Code Online (Sandbox Code Playgroud)

这将生成您想要的最终结果:

| COD | Something | Lasagna |
|-----|-----------|---------|
|   1 |      cars |    baby |
Run Code Online (Sandbox Code Playgroud)

现在,所有这是伟大的,如果你知道你需要的所有列UNPIVOT,然后PIVOT,但如果你不这样做,那么你就需要使用动态SQL来解决它。看起来像这样:

DECLARE 
    @colsUnpivot AS NVARCHAR(MAX),
    @colsPivot AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @colsUnpivot 
  = stuff((select ','+quotename(C.column_name)
           from information_schema.columns as C
           where C.table_name = 'tb1' and
                 C.column_name like 'A%'
           for xml path('')), 1, 1, '')

select @colsPivot 
  = stuff((select ','+quotename([DESCRIPTION])
           from Tb2
           for xml path('')), 1, 1, '')


set @query = 'select *
            from
            (
                select 
                    d.COD,
                    d.val,
                    t2.DESCRIPTION
                from
                (
                    select *
                    from tb1 t1
                    unpivot 
                    (
                        val
                        for col in ('+ @colsUnpivot +')
                    ) u
                )d
                inner join tb2 t2
                    on d.col = t2.NO_COL_TB1
            ) x
            pivot
            (
                max(val)
                for description in ('+@colsPivot+')
            ) p;';

exec sp_executesql @query;
Run Code Online (Sandbox Code Playgroud)

它很长,但它应该给你相同的结果。( dbfiddle 演示)