如何将 CTE 查询与 SQL Server 2008 中的另一个表连接

我创建了一个 CTE 查询,当 CTE 中的数据与另一个表匹配时,我设法加入了 CTE。

例如,这就是我的 CTE 查询结果的样子:

ID     NAME    REG      INV      CUS       BR
-----------------------------------------------
1     A0001   R0001    I0001    C0001     B0001
2     A0002   R0002    I0002    C0002     B0002
3     A0003   R0003    I0003    C0003     B0003
4     A0004   R0004    I0004    C0004     B0004

这是我设法将其加入的表:

ID    NAME     CUS 
---------------------
1     TEST1   C0001
2     TEST2   C0002
3     TEST3   C0003
4     TEST4   C0004

这是我选择 CTE 查询的代码

;WITH BaseQuery AS 
(
    SELECT  
        Id, Name, Comment, 
        CONVERT(XML, '<root><item>' 
                + REPLACE(
                    REPLACE(
                        REPLACE(
                            REPLACE((SELECT Comment AS '*' FOR XML PATH('')), 
                            'Reg:', 
                            '</item><item type="Reg">'), 
                        'Inv:', 
                        '</item><item type="Inv">'), 
                    'Cus:', 
                    '</item><item type="Cus">'), 
                'Br:', 
                '</item><item type="Br">') + '</item></root>') CommentAsXml
    FROM    
        GenTransaction
), Query (
SELECT  
    Id, Name, Comment, 
    Reg = LTRIM(RTRIM(bq.CommentAsXml.value('(root/item[@type="Reg"])[1]', 'VARCHAR(11)'))),
    Inv = LTRIM(RTRIM(bq.CommentAsXml.value('(root/item[@type="Inv"])[1]', 'VARCHAR(11)'))),
    Cus = LTRIM(RTRIM(bq.CommentAsXml.value('(root/item[@type="Cus"])[1]', 'VARCHAR(11)'))),
    Br  = LTRIM(RTRIM(bq.CommentAsXml.value('(root/item[@type="Br"])[1]', 'VARCHAR(11)'))) 
FROM    
    BaseQuery bq
)

选择 ArCustomer.Name, Query.Cus from ArCustomer left join Query on ArCustomer.Customer = Query.ArCustomer.Customer order by ArCustomer.Name

博格丹·萨利安

[ 1 ] 使用两个 CTE(BaseQuery、Query 和 table 和 Query 之间的连接):

;WITH BaseQuery AS 
(
    SELECT  
        Id, Name, Comment, 
        CONVERT(XML, '<root><item>' 
                + REPLACE(
                    REPLACE(
                        REPLACE(
                            REPLACE((SELECT Comment AS '*' FOR XML PATH('')), 
                            'Reg:', 
                            '</item><item type="Reg">'), 
                        'Inv:', 
                        '</item><item type="Inv">'), 
                    'Cus:', 
                    '</item><item type="Cus">'), 
                'Br:', 
                '</item><item type="Br">') + '</item></root>') CommentAsXml
    FROM    
        GenTransaction
), Query (
SELECT  
    Id, Name, Comment, 
    Reg = LTRIM(RTRIM(bq.CommentAsXml.value('(root/item[@type="Reg"])[1]', 'VARCHAR(11)'))),
    Inv = LTRIM(RTRIM(bq.CommentAsXml.value('(root/item[@type="Inv"])[1]', 'VARCHAR(11)'))),
    Cus = LTRIM(RTRIM(bq.CommentAsXml.value('(root/item[@type="Cus"])[1]', 'VARCHAR(11)'))),
    Br  = LTRIM(RTRIM(bq.CommentAsXml.value('(root/item[@type="Br"])[1]', 'VARCHAR(11)'))) 
FROM    
    BaseQuery bq
)
SELECT ...
FROM Table1 t1 INNER/LEFT OUTER/... JOIN Query q ON ... join condition ... -- Query represents the second CTE
ORDER BY ...

[ 2 ] 第二个解决方案也基于两个 CTE(BaseQuery 和 Query),但 JOIN 使用的是 APPLY 运算符,因此:

;WITH BaseQuery AS 
(
    SELECT  
        Id, Name, Comment, 
        CONVERT(XML, '<root><item>' 
                + REPLACE(
                    REPLACE(
                        REPLACE(
                            REPLACE((SELECT Comment AS '*' FOR XML PATH('')), 
                            'Reg:', 
                            '</item><item type="Reg">'), 
                        'Inv:', 
                        '</item><item type="Inv">'), 
                    'Cus:', 
                    '</item><item type="Cus">'), 
                'Br:', 
                '</item><item type="Br">') + '</item></root>') CommentAsXml
    FROM    
        GenTransaction
), Query (
SELECT  
    Id, Name, Comment, 
    Reg = LTRIM(RTRIM(bq.CommentAsXml.value('(root/item[@type="Reg"])[1]', 'VARCHAR(11)'))),
    Inv = LTRIM(RTRIM(bq.CommentAsXml.value('(root/item[@type="Inv"])[1]', 'VARCHAR(11)'))),
    Cus = LTRIM(RTRIM(bq.CommentAsXml.value('(root/item[@type="Cus"])[1]', 'VARCHAR(11)'))),
    Br  = LTRIM(RTRIM(bq.CommentAsXml.value('(root/item[@type="Br"])[1]', 'VARCHAR(11)'))) 
FROM    
    BaseQuery bq
)
SELECT ... t1.Col1 ... x.Col2 ...
FROM Table1 t1 
OUTER/CROSS APPLY (
    SELECT ...
    FROM Query q 
    WHERE ... join condition ... -- Query represents the second CTE
) x
ORDER BY ...

[ 3 ] 另一种解决方案是将这些行(从 Comment 列中提取)插入到临时表 (#Results) 中,然后将临时 (#Results) 表与另一个表 (Table1) 连接起来:

;WITH BaseQuery AS 
(
    SELECT  
        Id, Name, Comment, 
        CONVERT(XML, '<root><item>' 
                + REPLACE(
                    REPLACE(
                        REPLACE(
                            REPLACE((SELECT Comment AS '*' FOR XML PATH('')), 
                            'Reg:', 
                            '</item><item type="Reg">'), 
                        'Inv:', 
                        '</item><item type="Inv">'), 
                    'Cus:', 
                    '</item><item type="Cus">'), 
                'Br:', 
                '</item><item type="Br">') + '</item></root>') CommentAsXml
    FROM    
        GenTransaction
)
SELECT  
    Id, Name, Comment, 
    Reg = LTRIM(RTRIM(bq.CommentAsXml.value('(root/item[@type="Reg"])[1]', 'VARCHAR(11)'))),
    Inv = LTRIM(RTRIM(bq.CommentAsXml.value('(root/item[@type="Inv"])[1]', 'VARCHAR(11)'))),
    Cus = LTRIM(RTRIM(bq.CommentAsXml.value('(root/item[@type="Cus"])[1]', 'VARCHAR(11)'))),
    Br  = LTRIM(RTRIM(bq.CommentAsXml.value('(root/item[@type="Br"])[1]', 'VARCHAR(11)'))) 
INTO #Results
FROM    
    BaseQuery bq; -- ORDER BY here should be used within final query

SELECT ...
FROM Table1 t1 INNER/LEFT OUTER/... JOIN #Results r ON ... join condition build using t1./r... ...
ORDER BY ...


Id, Name, Comment

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

SQL Server 2008查询将表数据从一个移动到另一个

来自分类Dev

如何将两个查询合并为1的SQL Server 2008

来自分类Dev

如何从SQL Server中的查询中排除另一个表?

来自分类Dev

如何使用查询结果选择到SQL Server中的另一个表

来自分类Dev

将SQL Server 2012 CTE转换为SQL Server 2008

来自分类Dev

SQL Server:从另一个CTE查询获取DISTINCT TOP列表

来自分类Dev

如何将SQL Server 2008表从一个数据库导入到另一个数据库中的多个表中?

来自分类Dev

如何将SQL Server 2008表从一个数据库导入到另一个数据库的多个表中?

来自分类Dev

在SQL Server 2008中通过检查将varbinary从一个表移动到另一个表

来自分类Dev

SQL Server:查询以将数据从具有不同结构的另一个表插入表中

来自分类Dev

CTE查询SQL Server中的解析错误

来自分类Dev

SQL Server中的递归CTE查询

来自分类Dev

将一个表中的行集合连接到另一个表的列 - SQL Server

来自分类Dev

如何在Sql Server 2008中的一个MERGE查询中更新,插入,删除?

来自分类Dev

如何将表导入Microsoft SQL Server 2008?

来自分类Dev

如何将 SQL 查询从 SQL Server 2008 升级到 2012

来自分类Dev

如何从查询结果中删除“ NULL” SQL Server 2008

来自分类Dev

如何在SQL Server 2008查询中显示订单履行

来自分类Dev

如何在SQL Server 2008中编写此查询

来自分类Dev

如何在SQL Server 2008中编写此查询?

来自分类Dev

如何从查询结果中删除“ NULL” SQL Server 2008

来自分类Dev

SQL Server 2008 R2:选择另一个表中存在的记录

来自分类Dev

更改SQL Server 2008的表查询计划

来自分类Dev

SQL Server 2008查询-表联接

来自分类Dev

如何将 SQL 查询结果用作另一个查询中的列?

来自分类Dev

SQL Server 2008中的递归查询

来自分类Dev

使用CTE查询优化SQL Server 2008 R2进行改进

来自分类Dev

SQL Server:查询以从另一个表中获取表数据(计数)作为 VIEW

来自分类Dev

如何执行sql查询以连接sequelize.js中的count()列的另一个表

Related 相关文章

  1. 1

    SQL Server 2008查询将表数据从一个移动到另一个

  2. 2

    如何将两个查询合并为1的SQL Server 2008

  3. 3

    如何从SQL Server中的查询中排除另一个表?

  4. 4

    如何使用查询结果选择到SQL Server中的另一个表

  5. 5

    将SQL Server 2012 CTE转换为SQL Server 2008

  6. 6

    SQL Server:从另一个CTE查询获取DISTINCT TOP列表

  7. 7

    如何将SQL Server 2008表从一个数据库导入到另一个数据库中的多个表中?

  8. 8

    如何将SQL Server 2008表从一个数据库导入到另一个数据库的多个表中?

  9. 9

    在SQL Server 2008中通过检查将varbinary从一个表移动到另一个表

  10. 10

    SQL Server:查询以将数据从具有不同结构的另一个表插入表中

  11. 11

    CTE查询SQL Server中的解析错误

  12. 12

    SQL Server中的递归CTE查询

  13. 13

    将一个表中的行集合连接到另一个表的列 - SQL Server

  14. 14

    如何在Sql Server 2008中的一个MERGE查询中更新,插入,删除?

  15. 15

    如何将表导入Microsoft SQL Server 2008?

  16. 16

    如何将 SQL 查询从 SQL Server 2008 升级到 2012

  17. 17

    如何从查询结果中删除“ NULL” SQL Server 2008

  18. 18

    如何在SQL Server 2008查询中显示订单履行

  19. 19

    如何在SQL Server 2008中编写此查询

  20. 20

    如何在SQL Server 2008中编写此查询?

  21. 21

    如何从查询结果中删除“ NULL” SQL Server 2008

  22. 22

    SQL Server 2008 R2:选择另一个表中存在的记录

  23. 23

    更改SQL Server 2008的表查询计划

  24. 24

    SQL Server 2008查询-表联接

  25. 25

    如何将 SQL 查询结果用作另一个查询中的列?

  26. 26

    SQL Server 2008中的递归查询

  27. 27

    使用CTE查询优化SQL Server 2008 R2进行改进

  28. 28

    SQL Server:查询以从另一个表中获取表数据(计数)作为 VIEW

  29. 29

    如何执行sql查询以连接sequelize.js中的count()列的另一个表

热门标签

归档