2011-05-19 143 views
3

我必須從文件導入行到數據庫。我必須檢查外鍵是否存在。在此行的一個示例中,我應該導入:SQL:如何知道數據庫中是否存在一組值?

A 481 11/23/1981 12 77000 DESCRIPTION_1  $5,098 
A 482 11/23/1981 15 77000 DESCRIPTION_1  $5,098  
A 482 11/23/1981 12 77000 DESCRIPTION_1  $5,098 
A 481 11/23/1981 9 77000 DESCRIPTION_1  $5,098 
A 481 11/23/1981 12 77000 DESCRIPTION_1  $5,098 
A 481 11/23/1981 12 77000 DESCRIPTION_1  $5,098 
A 481 11/23/1981 1 77000 DESCRIPTION_1  $5,098 
A 481 11/23/1981 1 77000 DESCRIPTION_1  $5,098 
A 481 11/23/1981 1 77000 DESCRIPTION_1  $5,098 
A 481 11/23/1981 1 77000 DESCRIPTION_1  $5,098 

這裏的外鍵是12,15,9,12,1,我要檢查,如果這些外國關鍵之一。在示例中,外鍵12不存在。最簡單的方法就是測試一行一行:

SELECT COUNT(*) From TypeTable WHERE IdType = 12 -- 0 
SELECT COUNT(*) From TypeTable WHERE IdType = 15 -- 1 
SELECT COUNT(*) From TypeTable WHERE IdType = 9 -- 1 
SELECT COUNT(*) From TypeTable WHERE IdType = 12 -- 1 
SELECT COUNT(*) From TypeTable WHERE IdType = 1 -- 1 

這種方法的問題在於,對於每個不同的外鍵一個查詢和文件,我應該導入有上千行(和潛在的數以千計的外國鍵)。

所以我想知道是否有可能使用「SQL的設置功能」,在一次查詢檢索,但我不知道如何做到這一點...

PS:在結果我查詢時,我需要知道外鍵不存在數據庫中

問候,

弗洛裏安

+0

你有暫存桌嗎? – gbn 2011-05-19 10:05:28

+0

不,我正在尋找什麼是臨時表... – Florian 2011-05-19 12:18:50

回答

4

如果數據已經加載到一個臨時表,那麼你可以使用這個

SELECT 
    * 
FROM 
    myStagingTable ST 
WHERE 
    NOT EXISTS (SELECT * 
      FROM TypeTable TT 
      WHERE ST.FKCol = TT.IdType) 

東西一套基於這樣做,你需要與期望的FK值的表。這可能是同一連接上的臨時表,並通過掃描文件來填充。相同的SQL將通過改變myStagingTable#myFKTable

0

參數化查詢,並通過外鍵作爲參數?

IF EXISTS (SELECT * FROM TypeTable WHERE IdType = @foreignKey) 

如果你把這個變成一個功能,您可以使用CROSS APPLY命令調入一組的每一行的功能。

3

我將大量數據加載到臨時分段表在數據庫中上述方式工作,然後將它變成運行一個SELECT具有外部的簡單的情況下聯接:

SELECT DISTINCT s.ForeignKeyField 
FROM YourStagingTable s 
    LEFT JOIN FKTable f ON s.ForeignKeyField = f.ID 
WHERE f.ID IS NULL -- where the foreign key value does not exist 
相關問題