簡體   English   中英

如何將CTE查詢與SQL Server 2008中的另一個表聯接

[英]How to join CTE query with another table in 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中選擇ArCustomer.Name,Query.Cus並按ArCustomer.Name左鍵聯接Query on ArCustomer.Customer = Query.ArCustomer.Customer

WITH common_table_expression的文檔(Transact-SQL)

指定一個臨時的命名結果集,稱為公用表表達式(CTE)。 這是從一個簡單的查詢派生的,並在單個SELECT,INSERT,UPDATE或DELETE語句的執行范圍內定義。

由於CTE結果僅作用於一個語句,因此您需要將SELECT查詢的結果保存在表變量中或創建另一個CTE

帶表變量

DECLARE @BaseData AS TABLE (
    Id INT,
    Name VARCHAR(50),
    Comment VARCHAR(500),
    Reg VARCHAR(11),
    Inv VARCHAR(11),
    Cus VARCHAR(11),
    Br VARCHAR(11)
)

;WITH BaseQuery AS 
(
    -- your CTE
)

INSERT INTO @BaseData 
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
ORDER BY Id, Name, Comment

-- Join it with another table
SELECT *
FROM AnotherTable at
INNER JOIN @BaseData bd ON bd.Id = at.SomeId

與另一位CTE

;WITH BaseQuery AS 
(
    -- your CTE
)
,
BaseResult AS 
(
    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
)

-- Join  second result with another table
SELECT *
FROM AnotherTable at
INNER JOIN BaseResult br ON br.Id = at.SomeId

[1]使用兩個CTE(BaseQuery,Query以及表和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)中,然后將JOIN temp(#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

暫無
暫無

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

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