我有两个表:
t1camp_1 col_1t2 camp_2 col_2
col_1 col_2 col_31 22 4 63 6 94 8 12
我想创建一个语句,在t2
的SELECT列表中使用t1
的结果,并显示t2
的结果。
的例子:
步骤1:从表1中获取结果
select col_name from t1 where campaign_name = 'camp_1'
结果:col_1
步骤2:使用t2的结果(col_1
)并显示相应的结果
select col_1 from t2
最终结果应为
<>前123.4考虑这样修改模式:
t1(不变)
camp_1 col_1t2 camp_2 col_2
group_name col_name numgroup1 col_1 1组1 col_2 2Group1 col_3Group2 col_1组2 col_2 4Group2 col_3 6Group3 col_1组3 col_2 6Group3 col_3Group4 col_1组4 col_2 8group4 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)
上网试试吧!
如果不能将模式更改为>说。然后,首先,必须从表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)
方式二(用于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.