簡體   English   中英

合並多行數據

[英]Combining Data From Multiple Rows

我有3個表要編寫查詢:Memos,Memos_Description,策略。 該數據庫不是我自己設計的,我無法更改它,這只是一個報告。

我目前有一個查詢似乎正在運行,但在加入所需的額外表之前效率極低。

SELECT
    Main.CLIENTSNAME,
    Main.ENTRYDATE,
    Main.AUTHOR,
    Main.POLICYNUMBER,
    Main.CLIENTS_ID,
    Main.MEMOS_ID,
    Left(Main.DESCRIPTION,Len(Main.DESCRIPTION)) AS REGARDING
FROM
    (
        SELECT distinct ST1.MEMOS_ID, 
            (
                SELECT ST2.DESCRIPTION + ' ' AS [text()]
                FROM dbo.MEMOS_DESCRIPTION ST2
                WHERE ST1.MEMOS_ID = ST2.MEMOS_ID
                ORDER BY ST1.MEMOS_ID
                For XML PATH ('')
            ) [DESCRIPTION],
            ST1.CLIENTSNAME,
            ST1.ENTRYDATE,
            ST1.AUTHOR,
            ST1.POLICYNUMBER,
            ST1.REGARDING,
            ST1.CLIENTS_ID
        FROM dbo.MEMOS ST1
    ) [Main]

這些表如下所示:

tbl.MEMOS
MEMOS_ID
POLICIES_ID
CLIENTSNAME

tbl.MEMOS_DESCRIPTION
MEMOS_ID
DESCRIPTION

tbl.POLICIES
POLICIES_ID
POLICYNUMBER

數據如下所示:

tbl1.MEMOS_ID | tbl1.CLIENTSNAME
1                PERSON ONE
2                PERSON TWO
3                PERSON THREE

tbl2.MEMOS_ID | tbl2.DESCRIPTION
1               This is a sentence
1               that can run over more
1               than one description record.
2               Person two has
2               something different.
3               Client Created.

tbl3.POLICIES_ID | tbl3.POLICYNUMBER
123                ABCDE
456                FGHIJ

我希望報告看起來像:

tbl1.MEMOS_ID | tbl1.CLIENTSNAME | tbl2.DESCRIPTION                                                            | tbl3.POLICIES_ID | tbl3.POLICYNUMBER
1               PERSON ONE         This is a sentence that can run over more tan one description record.         123                ABCDE

我希望這是有道理的,謝謝。

根據戈登的建議答案更新了查詢:

SELECT ST1.*, 
    STUFF(
        (SELECT ' ' + ST2.DESCRIPTION AS [text()] 
            FROM dbo.MEMOS_DESCRIPTION ST2 
            WHERE ST1.MEMOS_ID = ST2.MEMOS_ID 
            ORDER BY ST1.MEMOS_ID 
            For XML PATH ('')
        ), 1, 1, '') [REGARDING] 
FROM 
    (SELECT DISTINCT ST1.MEMOS_ID,
        ST1.CLIENTSNAME,
        ST1.ENTRYDATE,
        ST1.AUTHOR,
        ST1.POLICYNUMBER,
        ST1.CLIENTS_ID,
        ST1.POLICIES_ID 
    FROM dbo.MEMOS ST1
    ) ST1 

LEFT JOIN POLICIES B 
    ON ST1.POLICIES_ID = B.POLICIES_ID 

WHERE ST1.ENTRYDATE >= DATEADD(month, -2, GETDATE()) 
    AND (B.PROD1 = ('123') OR B.PROD1 = ('456') OR B.PROD1 = ('789'))

如果您在進行字符串聚合之前 select distinct ,那么性能如何比較?

    SELECT ST1.*, 
           STUFF((SELECT ' ' + ST2.DESCRIPTION AS [text()]
                  FROM dbo.MEMOS_DESCRIPTION ST2
                  WHERE ST1.MEMOS_ID = ST2.MEMOS_ID
                  ORDER BY ST1.MEMOS_ID
                  For XML PATH ('')
                 ), 1, 1, '') ) [DESCRIPTION]
    FROM (SELECT DISTINCT T1.MEMOS_ID, ST1.CLIENTSNAME, ST1.ENTRYDATE,
                 ST1.AUTHOR, ST1.POLICYNUMBER, ST1.REGARDING, ST1.CLIENTS_ID
          FROM dbo.MEMOS ST1
         ) ST1

我懷疑SQL Server可能運行不同的行之前對每一行進行字符串聚合-這是很多不必要的工作。

暫無
暫無

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

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