【问题标题】:SQL Server select column names from multiple tablesSQL Server 从多个表中选择列名
【发布时间】:2019-03-08 08:43:27
【问题描述】:

我在 SQL Server 中有三个表,结构如下:

col1 col2 a1 a2 ...一个, col1 col2 b1 b2 ... bn, col1 col2 c1 c2 ... cn

前两条记录相同,col1 和 col2,但是表的长度不同。

我需要选择表的列名,我想要达到的结果如下:

col1, col2, a1, b1, c1, a2, b2, c2 ...

有办法吗?

【问题讨论】:

  • 这是不可能的,实际上是一个毫无意义的问题,除非你也告诉我们三个表之间的关系是什么。
  • 一张桌子有不同的“长度”是什么意思?实际样本数据和预期结果可能会帮助我们了解您的目标,但目前还不清楚。
  • col1 和 col2 在三个表中是相同的。表1:col1,col2,a1,a2,a3...an,表2:col1,col2,b1,b2,b3...bn,表3:col1,col2,c1,c2,c3...cn我需要选择列标题并获得这样的结果:col1、col2、a1、b1、c1、a2、b2、c2、a3、b3、c3 等等。很抱歉,我没有任何 SQL Server 经验
  • 您有 3 张桌子,但没有告诉我们如何加入这些桌子。理想情况下,您提供用于创建这些表的实际 SQL 代码,并指定这些表如何连接以获得所需的输出。

标签: sql sql-server


【解决方案1】:

这是可能的,但结果被合并到三个表格的单列中。

例如

SELECT A.col1 +'/' +B.col1 +'/' + C.col1  As Col1 ,
A.col2 +'/' +B.col2 +'/' + C.col2 As col2 ,a1, b1, c1, a2, b2, c2 ,
* FROM A
INNER JOIN B
ON A.ID =B.ID
INNER JOIN C 
ON C.ID = B.ID

【讨论】:

    【解决方案2】:

    SQL-Server 不是创建通用结果集的正确工具。引擎需要提前知道会发生什么。好吧,您可能会尝试使用 动态 SQL...

    找到解决方案

    我想提出两种不同的方法。

    只要它们的列 col1col2 具有适当的类型,两者都可以处理任意数量的表。

    让我们先创建一个简单的mokcup 场景

    DECLARE @mockup1 TABLE(col1 INT,col2 INT,SomeMore1 VARCHAR(100),SomeMore2 VARCHAR(100));
    INSERT INTO @mockup1 VALUES(1,1,'blah 1.1','blub 1.1')
                              ,(1,2,'blah 1.2','blub 1.2')
                              ,(1,100,'not in t2','not in t2');
    
    DECLARE @mockup2 TABLE(col1 INT,col2 INT,OtherType1 INT,OtherType2 DATETIME);
    INSERT INTO @mockup2 VALUES(1,1,101,GETDATE())
                              ,(1,2,102,GETDATE()+1)
                              ,(1,200,200,GETDATE()+200);
    --You can add as many tables as you need
    

    非常务实的做法:

    试试这个简单的FULL OUTER JOIN

    SELECT * 
    FROM @mockup1 m1
    FULL OUTER JOIN @mockup2 m2 ON m1.col1=m2.col1 AND m1.col2=m2.col2
    --add more tables here
    

    结果

    +------+------+-----------+-----------+------+------+------------+-------------------------+
    | col1 | col2 | SomeMore1 | SomeMore2 | col1 | col2 | OtherType1 | OtherType2              |
    +------+------+-----------+-----------+------+------+------------+-------------------------+
    | 1    | 1    | blah 1.1  | blub 1.1  | 1    | 1    | 101        | 2019-03-08 10:53:20.257 |
    +------+------+-----------+-----------+------+------+------------+-------------------------+
    | 1    | 2    | blah 1.2  | blub 1.2  | 1    | 2    | 102        | 2019-03-09 10:53:20.257 |
    +------+------+-----------+-----------+------+------+------------+-------------------------+
    | 1    | 100  | not in t2 | not in t2 | NULL | NULL | NULL       | NULL                    |
    +------+------+-----------+-----------+------+------+------------+-------------------------+
    | NULL | NULL | NULL      | NULL      | 1    | 200  | 200        | 2019-09-24 10:53:20.257 |
    +------+------+-----------+-----------+------+------+------------+-------------------------+
    

    但是您将不得不处理非唯一的列名...(此时动态创建的语句可以提供帮助)。

    使用容器类型 XML 的通用方法

    当您事先不知道结果时,您可以将结果打包到容器中。这允许在您的 RDBMS 方面有一个清晰的结构,并将如何处理这个集合的麻烦转移给消费者。

    • cte 将读取所有现有的 col1 和 col2 对
    • 该对值的每个表的行都作为 XML 插入
    • 任何表中都不存在的对显示为 NULL

    试试这个

    WITH AllDistinctCol1Col2Values AS
    (
        SELECT col1,col2 FROM @mockup1
        UNION ALL 
        SELECT col1,col2 FROM @mockup2
        --add all your tables here
    )
    SELECT col1,col2
         ,(SELECT * FROM @mockup1 x WHERE c1c2.col1=x.col1 AND c1c2.col2=x.col2 FOR XML PATH('row'),TYPE) AS Content1 
         ,(SELECT * FROM @mockup2 x WHERE c1c2.col1=x.col1 AND c1c2.col2=x.col2 FOR XML PATH('row'),TYPE) AS Content2
    FROM AllDistinctCol1Col2Values c1c2
    GROUP BY col1,col2;
    

    结果

    +------+------+-----------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------+
    | col1 | col2 | Content1                                                                                                  | Content2                                                                                                              |
    +------+------+-----------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------+
    | 1    | 1    | <row><col1>1</col1><col2>1</col2><SomeMore1>blah 1.1</SomeMore1><SomeMore2>blub 1.1</SomeMore2></row>     | <row><col1>1</col1><col2>1</col2><OtherType1>101</OtherType1><OtherType2>2019-03-08T11:03:49.877</OtherType2></row>   |
    +------+------+-----------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------+
    | 1    | 2    | <row><col1>1</col1><col2>2</col2><SomeMore1>blah 1.2</SomeMore1><SomeMore2>blub 1.2</SomeMore2></row>     | <row><col1>1</col1><col2>2</col2><OtherType1>102</OtherType1><OtherType2>2019-03-09T11:03:49.877</OtherType2></row>   |
    +------+------+-----------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------+
    | 1    | 100  | <row><col1>1</col1><col2>100</col2><SomeMore1>not in t2</SomeMore1><SomeMore2>not in t2</SomeMore2></row> | NULL                                                                                                                  |
    +------+------+-----------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------+
    | 1    | 200  | NULL                                                                                                      | <row><col1>1</col1><col2>200</col2><OtherType1>200</OtherType1><OtherType2>2019-09-24T11:03:49.877</OtherType2></row> |
    +------+------+-----------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-15
      • 1970-01-01
      • 2017-10-09
      • 1970-01-01
      • 2013-01-09
      • 2021-11-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多