繁体   English   中英

将 SELECT 列表中一个表的查询结果用于另一个表

[英]Using query results from one table in the SELECT list for another table

我有 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

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

t1(不变)

campaign_name col_name
camp_1        col_1
camp_2        col_2

t2

group_name col_name num
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:

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

好处:

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

如果您无法更改架构,则仍有可能在没有动态 SQL 的情况下更改 select 值。 您可以使用详尽的功能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)

上网试试吧!

如果你不能像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 路径):

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中获取动态列值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM