2014-06-16 38 views
2

我正在將數據加載到「暫存」數據庫模式中的父子對錶中。如果以前在「主」數據庫模式中加載到父 - 子對錶中的重複記錄,我想從「分段」數據庫表中刪除它們。刪除在另一個父子表中找到的父子表中的行

這個查詢

SELECT A.*,B.* 
FROM STG.AUTO_REPR_PAR_STG A 
JOIN STG.AUTO_REPR_CHLD_STG B 
ON A.TEST_SEQ_NUM=B.TEST_SEQ_NUM 
WHERE EXISTS ( SELECT A.*, B.* 
       FROM MST.AUTO_REPR_PAR A 
       JOIN MST.AUTO_REPR_CHLD B 
       ON A.TEST_SEQ_NUM=B.TEST_SEQ_NUM 
      ) 

會顯示哪些內容在以前在主加載升級。但是,我如何從臨時數據庫中的父 - 子對錶中刪除?我畫一個「空白」 ......我試過,但它的炸彈(「表中不允許FROM子句」):

DELETE FROM STG.AUTO_REPR_PAR_STG A 
      JOIN STG.AUTO_REPR_CHLD_STG B 
      ON A.TEST_SEQ_NUM=B.TEST_SEQ_NUM 
      WHERE EXISTS (SELECT A.*, B.* 
         FROM MST.AUTO_REPR_PAR A 
         JOIN MST.AUTO_REPR_CHLD B 
         ON A.TEST_SEQ_NUM=B.TEST_SEQ_NUM 
         ) 

後端是Teradata的V13。我目前正在研究CASCADE DELETE選項,但我甚至不確定它是否支持....任何想法?

+0

它是否在from子句中不允許連接表?我敢打賭,在這種情況下,你需要弄清楚如何在你的'WHERE EXISTS'子句中完成同樣的事情。 – Andrew

+0

你找到了這個答案嗎? – TMNT2014

+0

你嘗試過級聯嗎? –

回答

3

有沒有辦法從多個表中的一個單一的DELETE語句刪除,你需要爲每個表:

DELETE FROM STG.AUTO_REPR_PAR_STG A 
WHERE TEST_SEQ_NUM IN (
SELECT A.TEST_SEQ_NUM FROM MST.AUTO_REPR_PAR A JOIN MST.AUTO_REPR_CHLD B 
ON A.TEST_SEQ_NUM=B.TEST_SEQ_NUM) 
;DELETE FROM STG.AUTO_REPR_CHLD_STG B 
WHERE TEST_SEQ_NUM IN (
SELECT A.TEST_SEQ_NUM FROM MST.AUTO_REPR_PAR A JOIN MST.AUTO_REPR_CHLD B 
ON A.TEST_SEQ_NUM=B.TEST_SEQ_NUM) 

如果你運行這個作爲一個多語句請求的連接將只進行一次。

+0

這很有道理!我會刺傷它並在接下來的24小時內彙報。 – Chris

+0

先從小孩處刪除,然後再從父母處刪除。 ;-) –

+0

@Janine Rawnsley:你說得對,我只是使用了剪切和粘貼:-)我認爲父子關係只是一個邏輯關係,它們很難在數據倉庫中的數據模型中實現。否則,您可以直接刪除使用子表而不加入父母:-) – dnoeth

0

您可以嘗試這樣的事:

  • 而是和已有的條款子查詢,你可以使用一個OUTER JOIN - 選擇與目標外表中的NULL列的所有行,即不可─匹配行;
  • 將上一個查詢的結果保存到臨時表中,然後運行2 DELETE語句。

與具有EXISTS的子查詢相比,OUTER JOIN效率更高,特別是對於大型數據集。

相關問題