-1

如果已經發送技術人員將問題修復到客戶端主頁,我有以下CTE查詢來查找。使用TSQL從遞歸CTE查詢中複製數據

此表包含安裝之間的關係數據。它告訴我安裝A是否與B鏈接,如果B與D鏈接,則使A和D鏈接。這可以繼續進行90個不同的條目來創建一個大的關係方案。

INIR_Id:ID

INIR_INST_Id:安裝ID

INIR_INRE_Id關係ID

INIR_Date:日期已添加的關係。

CREATE TABLE [dbo].[CPL_t_Installations_InstallationsRelations](
    [INIR_Id] [bigint] IDENTITY(1,1) NOT NULL, 
    [INIR_INST_Id] [int] NOT NULL, 
    [INIR_INRE_Id] [bigint] NOT NULL, 
    [INIR_Date] [datetime] NOT NULL, 
CONSTRAINT [PK_CPL_t_Installations_InstallationsRelations] PRIMARY KEY CLUSTERED 
(
    [INIR_Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 


WITH Tempou(Relation,Installation,Date,Origine)AS 
(
    (
     SELECT 
      INIR_INRE_Id, 
      INIR_INST_Id, 
      INIR_Date, 
      1 
     FROM 
      CPL_t_Installations_InstallationsRelations 
     WHERE 
      ([email protected]_Id) 
    ) 
    UNION ALL 
    (
     SELECT 
      INIR_INRE_Id, 
      INIR_INST_Id, 
      INIR_Date, 
      0 
     FROM 
      CPL_t_Installations_InstallationsRelations 
       INNER JOIN Tempou Alpha ON(Relation=INIR_INRE_Id) 
     WHERE 
      (INIR_Date<Date) 
      AND NOT 
      (
       (Installation=INIR_INST_Id) 
       AND 
       (Relation=INIR_INRE_Id) 
      ) 
    ) 
) 
SELECT TOP * FROM Tempou; 

查詢的問題是它循環回到CTE結果集中的每個日期。每個結果都會重複一段時間。我使用日期作爲監控數據,從無限多次到128個條目的結果集。但是,如果我們使用DISTINCT查詢Tempou中的所有內容,我們就會做14個結果,這是正確的數字。除了最好的日期數據之外,沒有分層數據。

我一直在這工作幾天,從無限的結果到128是相當不錯的,但它不是答案。我可能會很累,並且看不到這個問題。留下我問你所有我看不到的東西。

Ps .:我沒有數據可以作爲例子分享,但結果的「級別」數量沒有限制,有些客戶可能有2個級別,有些可能有20個。而且鏈接的數據當然是不是對稱的,有些「根」可能比其他的短。

謝謝!除此之外,如果我可以讓用戶「Tempou」執行「NOT EXISTS」,那麼問題就可以解決,但是CTE不可能複製每個條目。所以我真的想要找到一種方法來改變CTE,以便能夠複製這種行爲。

+2

將別名添加到您的連接並在所有參考中使用它們可能會讓我們更好地瞭解您正在嘗試做什麼。向我們展示表格模式也會有所幫助。 – HABO

+0

至少有一個問題「INNER JOIN CPL_t_Installations_InstallationsRelations ON(INIR_INRE_Id = INRE_Id)」其中表的INIR_INRE_Id,其中表的INRE_Id ... – bummi

+0

@bummi 我更新了查詢以更正它。這段代碼現在應該在那裏,我很可能上傳了一個我正在玩的版本。 – Rv3

回答

0

@ RV3,首先,SELECT TOP * FROM Tempou不會編譯,但我會離開它作爲一個錯字

快速的問題,是你的CTE進入無限循環?嘗試在JOIN中切換它們並查看它是否有效。 而不是

FROM 
      CPL_t_Installations_InstallationsRelations 
       INNER JOIN Tempou Alpha ON(Relation=INIR_INRE_Id) 
     WHERE 
      (INIR_Date < Date) 
      AND NOT 
      (
       (Installation=INIR_INST_Id) 
       AND 
       (Relation=INIR_INRE_Id) 
      ) 

嘗試

FROM 
      Tempou Alpha 
       INNER JOIN (Select * from CPL_t_Installations_InstallationsRelations 
          WHERE 
      (INIR_Date < Date) 
      AND NOT 
      (
       (Installation=INIR_INST_Id) 
       AND 
       (Relation=INIR_INRE_Id) 
      ) 
      ) temp_tab 
      ON(Relation=temp_tab.INIR_INRE_Id) 

很顯然,我還沒有試過運行此所以道歉,如果你需要修復一點點得到它的工作。