簡體   English   中英

如何根據另一個表中多個列的值從一個表中提取多行,然后在 SQL 中連接?

[英]How to extract multiple rows from a table based on values from multiple columns from another table and then concatenate in SQL?

我有兩個表,表 1 和表 2。表 1 有“開始”和“結束”列。 表 2 具有列“位置”和“序列”。 我想從表 2 中提取序列,從 position = start 到 position = end 並使用連接字符串創建一個新列。

表格1

開始 結尾
100 104
105 109

表 2

Position 序列
100 一個
101
102 C
103
104 G
105
106
107 G
108
109 G

我的最終結果需要是

開始 結尾 序列
100 104 ATCTG
105 109 TTGTG

我嘗試使用以下語句連接表 2 中的值

 SELECT Sequence = (Select '' + Seq 
 from Table2
 where Position >= 100 and Position <= 104
 order by Position FOR XML PATH('')

)

您沒有 state 您正在使用什么 DBMS,所以這里是一個 SQL 服務器解決方案,使用 CTE 和 FOR XML 來執行轉置:

; WITH SequenceCTE AS
(
    SELECT  [Start],
            [End],
            Seq
    FROM    Table1 a
            JOIN Table2 b
                ON b.Position >= a.[Start] AND
                  b.Position <= a.[End]
)
SELECT  DISTINCT
        a.[Start],
        a.[End],
        (
            SELECT  STUFF(',' + Seq,1,1,'')
            FROM    SequenceCTE b
            WHERE   a.[Start] = b.[Start] AND
                    a.[End] = b.[end]
            FOR XML PATH ('') 
        )
FROM    SequenceCTE a

在標准 SQL 中,您可以執行以下操作:

select t1.start, t1.end,
       listagg(t2.position, '') within group (order by t2.seq) as sequence
from table1 t1 join
     table2 t2
     on t2.position between t1.start and t2.end
group by t1.start, t1.end;

大多數數據庫支持聚合字符串連接,但 function 可能有不同的名稱和略有不同的語法。

請注意, startend是列的糟糕名稱,因為它們是 SQL 關鍵字 - 大多數數據庫中的sequence也是如此。

您可以為您的第一個表生成行號,稍后可用於在加入這些數字后對范圍進行分組:

with to_id as (select row_number(*) over (order by t1.start) id, t1.* from table1 t1), 
     ranges as (select t3.id, t2.* from table2 t2 join to_id t3 on t3.start <= t2.position and t2.position <= t3.end)
select t3.start, t3.end, group_concat(r1.seq, '') from ranges r1 join to_id t3 on r1.id = t3.id group by r1.id;

查看交叉表查詢是如何完成的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM