简体   繁体   English

合并多行数据

[英]Combining Data From Multiple Rows

I have 3 tables I am writing a query for: Memos, Memos_Description, Policies. 我有3个表要编写查询:Memos,Memos_Description,策略。 The database was not designed by myself and I cannot change it, this is simply a report. 该数据库不是我自己设计的,我无法更改它,这只是一个报告。

I currently have a query that seems to be working, but is extremely inefficient before joining the extra tables that I need. 我目前有一个查询似乎正在运行,但在加入所需的额外表之前效率极低。

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]

The tables look like this: 这些表如下所示:

tbl.MEMOS
MEMOS_ID
POLICIES_ID
CLIENTSNAME

tbl.MEMOS_DESCRIPTION
MEMOS_ID
DESCRIPTION

tbl.POLICIES
POLICIES_ID
POLICYNUMBER

The data looks like this: 数据如下所示:

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

I would like the report to look like: 我希望报告看起来像:

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

I hope this makes sense and thank you. 我希望这是有道理的,谢谢。

Updated Query as per Gordon's suggested answer: 根据戈登的建议答案更新了查询:

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'))

How does the performance compare if you do the select distinct before doing the string aggregation? 如果您在进行字符串聚合之前 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

I suspect that SQL Server might be doing the string aggregation for every row before running distinct -- and that is a lot of unnecessary work. 我怀疑SQL Server可能运行不同的行之前对每一行进行字符串聚合-这是很多不必要的工作。

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

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