【发布时间】:2020-05-24 07:59:56
【问题描述】:
我有以下情况。
我得到了一些经过验证的、未经验证的记录和(比如说)主验证记录的表格。编辑:在表中,我得到了标准的唯一 ID 字段,但还有一个名为 VerifiedRecordID 的列指向表中的其他记录,或者它为 NULL。
如果记录的 VerifiedRecordID = NULL,则为未验证记录。
如果记录有 VerifiedRecordID = some_id,那么这条记录是经过验证的,并且
ID=some_id 是主验证的记录。
许多验证记录可能指向一个主验证记录。最后一个只是为了提供经过验证的记录和经过验证的数据,不能直接访问。
但是还有另一个因素决定记录是否被验证,不仅仅是这个字段,所以验证是由存储过程决定的。因此,如果您访问未验证的记录,它将返回其字段。如果您访问经过 IS 验证的记录,它将忽略其字段(ID 除外)并返回它指向的主验证记录的字段(ID 除外)。
所以,我想创建一个存储过程,通过传递的@ids 参数从表中提取记录,该参数可能包含已验证或未验证记录的 id(但不是主已验证记录,因为它们不能直接访问)。我得到了这个:
DECLARE @verifiedMasterRecordsIds [dbo].[Ints]
INSERT INTO @verifiedMasterRecordsIds
EXEC sp_getVerifiedMasterRecordsIds
SELECT record.ID,
CASE
WHEN record.ID IN (SELECT ID FROM @verifiedMasterRecordsIds)
THEN verRecord.Field1
ELSE record.Field1
END AS Field1,
CASE
WHEN record.ID IN (SELECT ID FROM @verifiedMasterRecordsIds)
THEN verRecord.Field2
ELSE record.Field2
END as Field2,
CASE
WHEN record.ID IN (SELECT ID FROM @verifiedMasterRecordsIds)
THEN verRecord.Field3
ELSE record.Field3
END as Field3,
CASE
WHEN record.ID IN (SELECT ID FROM @verifiedMasterRecordsIds)
THEN verRecord.Field4
ELSE record.Field4
END AS Field4
INTO #TempRecords
FROM Records as record
LEFT JOIN Records as verRecord ON record.VerifiedRecordID=verRecord.ID
WHERE record.ID IN (SELECT ID FROM @ids)
我的第一个也是最明显的问题是每个选择条件中的冗余代码(SELECT ID FROM @verifiedMasterRecordsIds)。如何对其进行重构以避免冗余? 另外,如果有更好的方法可以用这种逻辑从这个表中提取数据,我会很高兴看到它。
【问题讨论】:
-
如果
ID是唯一的,则外连接@verifiedMasterRecordsIds -
ID 字段是唯一的。问题已编辑。
-
使用
LEFT JOIN @verifiedMasterRecordsIds -
什么是#TempRecords 表?为什么它与 CTE 中的 INTO 语句一致?
-
#TempRecords 稍后将用于进一步查询。可能与当前问题无关。
标签: sql sql-server redundancy