2017-08-02 82 views
0

我創建了一個CTE查詢,並且當CTE中的數據與另一個表匹配時,我設法加入了CTE。如何將CTE查詢與SQL Server 2008中的另一個表連接起來

例如,這是我的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 從ArCustomer左加入Q上ArCustomer.Customer = Query.ArCustomer.Customer 順序uery 通過ArCustomer.Name

+0

可以使用CTE結果只有一次,因此對於另一個使用它加入你有幾個操作tions:1.在第一個查詢中加入另一個表的CTE結果。 2.將CTE結果保存在表變量中,並與另一個表重複使用。 3.將CTE結果的第一個查詢放在另一個CTE中,並使用第二個CTE結果與另一個表 – Fabio

+0

謝謝,我在選擇CTE查詢時遇到問題,並與其他 – tang

+0

@tang進行比較:您有什麼問題?你是否試圖將CTE的結果加入另一個表格? –

回答

1

[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和查詢),但代替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]另一種解決方案是插入這些行(從柱的評論中提取)到一個臨時表(#Results)然後再加入溫度(#Results)表與另一個表(表1):

;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 
1

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 
+0

謝謝,讓我說nid加入id,由CTE查詢生成,如何應用代碼? – tang

+0

我的Inv,reg,cus表是從Comment列中拆分出來的,但我不想使用cus表作爲id加入其他表變量 – tang

+0

在那裏你可以找到加入兩個表的信息:[Using Joins](https:// technet .microsoft.com/EN-US /庫/ ms191472(v = SQL.105)的.aspx)。加入時請考慮CTE作爲表格。 – Fabio