【问题标题】:Using query results from one table in the SELECT list for another table将 SELECT 列表中一个表的查询结果用于另一表
【发布时间】:2021-02-28 05:14:45
【问题描述】:

我有 2 张桌子:

t1

campaign_name col_name camp_1 col_1 camp_2 col_2

t2

col_1 col_2 col_3 1 2 3 2 4 6 3 6 9 4 8 12

我想创建一个语句来使用来自t2 SELECT 列表中t1 的结果并显示t2 结果。

例子:

第 1 步:从表 1 中获取结果

select col_name from t1 where campaign_name = 'camp_1'

结果:col_1

第 2 步:将结果 (col_1) 用于 t2 并显示相应的结果

select col_1 from t2 

最终结果应该是

1 2 3 4

【问题讨论】:

  • 就用一堆case表达式case t1.col_name when 'col_1' then t2.col_1 when 'col_2' then t2.col_2 ... end
  • @Charlieface 这看起来像示例数据。如果真实数据有更多列怎么办?
  • 然后我会考虑更改架构,正如@slartidan 提到的那样,我很少看到实际上有意义的宽表。

标签: sql sql-server


【解决方案1】:

考虑将您的架构更改为以下内容:

t1(不变)

campaign_name col_name camp_1 col_1 camp_2 col_2

t2

group_name col_name 编号 group1 col_1 1 group1 col_2 2 group1 col_3 3 group2 col_1 2 group2 col_2 4 group2 col_3 6 group3 col_1 3 group3 col_2 6 group3 col_3 9 group4 col_1 4 group4 col_2 8 group4 col_3 12

然后您可以选择:

SELECT num
FROM t1
  JOIN t2 ON t1. col_name = t2. col_name
WHERE t1.campaign_name = 'camp_1'

好处:

  • SQL-Server 可以优化您的查询,使其更快
  • 使用单个 SQL 查询两个表
  • 您可以通过同时组合两个表的条​​件来定义更多复杂语句

如果您无法更改架构,仍然可以选择不使用动态 SQL 的值。您可以使用详细功能 UNPIVOT - 将多列中的数据转换为其他行中的数据。

WITH unpivot_t2 AS (
    SELECT  *
    FROM   t2
    UNPIVOT  
      (value FOR col_name IN (col_1, col_2, col_3))
    AS unpvt
)
SELECT value
FROM unpivot_t2
JOIN t1 ON t1.col_name = unpivot_t2.col_name
WHERE campaign_name = 'camp_1'

有了这个 DDL:

CREATE TABLE t1 (
    campaign_name varchar(255),
    col_name varchar(255)
)
INSERT INTO t1 VALUES
    ('camp_1', 'col_1'),
    ('camp_2', 'col_2')

CREATE TABLE t2 (
    col_1 varchar(255),
    col_2 varchar(255),
    col_3 varchar(255)
)
INSERT INTO t2 VALUES
    (1,2,3),
    (2,4,6),
    (3,6,9),
    (4,8,12)

Give it a try online!

【讨论】:

    【解决方案2】:

    如果您不能像 slartidan 所说的那样更改架构。 然后,首先,您必须从表中获取所需的列名,t1

    方法一(使用 SQL 连接)

    DECLARE @Columns VARCHAR(MAX) = ''
    
    SELECT @Columns = @Columns + col_name + ','
    FROM t1
    WHERE campaign_name = 'camp_1'
    GROUP BY col_name
    SET @Columns = LEFT(@Columns,LEN(@Columns)-1)
    

    方式二(使用 FOR XML PATH):

    DECLARE @Columns VARCHAR(MAX) = ''
    
    SELECT @Columns = STUFF((SELECT ',' + col_name
    FROM t1
    WHERE campaign_name = 'camp_1'
    GROUP BY col_name
    FOR XML PATH('')) ,1,1,'')
    

    然后你必须执行一个原始的 SQL。

    EXEC ('SELECT ' + @Columns + ' FROM t2')
    

    希望,然后您可以从所需的表中获取动态列值,t2

    【讨论】:

      猜你喜欢
      • 2018-07-16
      • 1970-01-01
      • 2022-08-10
      • 1970-01-01
      • 2013-10-28
      • 2017-02-17
      • 1970-01-01
      • 2017-06-30
      • 2020-08-25
      相关资源
      最近更新 更多