我必须将行从文件导入到数据库中。我必须检查外键是否存在。下面是我应该导入的代码行示例:
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这种方法的问题是,每个不同的外键都有一个查询,我应该导入的文件有数千行(可能还有数千个外键)。
所以我想知道是否有可能使用"set feature of SQL“在一个查询中检索,但我不知道如何做到这一点…
PS :在我的查询结果中,我需要知道外键在数据库中不存在
致以敬意,
弗洛里安
发布于 2011-05-19 18:07:46
如果数据已加载到临时表中,则可以使用以下命令
SELECT
*
FROM
myStagingTable ST
WHERE
NOT EXISTS (SELECT *
FROM TypeTable TT
WHERE ST.FKCol = TT.IdType)要执行基于集合的操作,您需要一个包含所需FK值的表。这可以是同一连接上的临时表,并通过扫描文件来填充。同样的SQL也可以通过将myStagingTable更改为#myFKTable来工作。
发布于 2011-05-19 18:07:55
我会将数据批量加载到数据库中的临时临时表中,然后就变成了使用外部连接运行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发布于 2011-05-19 18:07:18
是否将查询参数化并将外键作为参数传递?
IF EXISTS (SELECT * FROM TypeTable WHERE IdType = @foreignKey)如果将其放入一个函数中,则可以使用CROSS APPLY命令为集合的每一行调用该函数。
https://stackoverflow.com/questions/6056950
复制相似问题