簡體   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