简体   繁体   English

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

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

I have 2 tables:我有 2 张桌子:

t1 t1

campaign_name col_name
camp_1        col_1
camp_2        col_2

t2 t2

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

I want to create a statement to use results from t1 in the SELECT list for t2 and show t2 results.我想创建一个语句来使用t2的 SELECT 列表中的t1结果并显示t2结果。

Example:例子:

Step 1: get results from table 1步骤 1:从表 1 中获取结果

select col_name from t1 where campaign_name = 'camp_1'

Result: col_1结果: col_1

Step 2: Use the result ( col_1 ) for t2 and show the corresponding results第 2 步:将结果 ( col_1 ) 用于 t2 并显示相应的结果

select col_1 from t2 

The end results should be最终结果应该是

1
2
3
4

Consider to change your schema to something like this:考虑将您的架构更改为以下内容:

t1 (unchanged) t1(不变)

campaign_name col_name
camp_1        col_1
camp_2        col_2

t2 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

You can then select:然后您可以 select:

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

Benefits:好处:

  • The SQL-Server can optimize your query, which makes it faster SQL-Server 可以优化您的查询,使其更快
  • Use single SQL to query both tables使用单个 SQL查询两个表
  • You can define more sophisticated statements, by combining conditions for both tables at once您可以通过同时组合两个表的条件来定义更复杂的语句

If you cannot change your schema, there is still a possibility to select the values without dynamic SQL.如果您无法更改架构,则仍有可能在没有动态 SQL 的情况下更改 select 值。 You can use the elaboratet feature UNPIVOT - which converts data from several columns into data in additional rows.您可以使用详尽的功能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'

With this DDL:使用此 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!上网试试吧!

If you cannot change your schema as slartidan said.如果你不能像slartidan所说的那样改变你的架构。 Then, first, you have to get your required column name(s) from the table, t1 .然后,首先,您必须从表t1中获取所需的列名。

Way One (Using SQL Concatenation)方式一(使用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)

Way Two (Using FOR XML PATH):方式二(使用 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,'')

Then you have to execute a raw SQL.然后你必须执行一个原始的 SQL。

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

Hope, Then you can get dynamic column values from your desired table, t2 .希望,然后您可以从所需的表t2中获取动态列值。

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

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