WHERE是否在嵌套选择中不起作用

时间:2014-07-10 18:31:55

标签: sql sql-server

INSERT INTO AutomatedTest_XMLReconciliation(TaskID, TestCaseID, TestInstanceID, XMLHierarchyLevelID, XMLNode, XMLValue_Truth, XMLValue_Test)
(
(SELECT A.TaskID, A.TestCaseID, NULL, A.XMLHierarchyLevelID, A.XMLNode, A.XMLValue_Truth, NULL
FROM AutomatedTest_XMLTruthData A
LEFT JOIN AutomatedTest_Auth B
ON A.TestCaseID = B.TestCaseID
FULL Join AutomatedTest_XMLTestData C
ON B.TestInstanceID = C.TestInstanceID AND A.TruthIdentity = C.TestIdentity AND A.XMLHierarchyLevelID = C.XMLHierarchyLevelID AND A.XMLNode = C.XMLNode AND A.TaskID = C.TaskID
WHERE (B.ReconcileDate IS NULL AND A.TaskID IS NOT NULL)

EXCEPT
   (Select A.TaskID, A.TestCaseID, NULL, A.XMLHierarchyLevelID, A.XMLNode, A.XMLValue_Truth, NULL
    FROM AutomatedTest_XMLTruthData A
    INNER JOIN AutomatedTest_Auth B
    ON A.TestCaseID = B.TestCaseID
    INNER JOIN AutomatedTest_XMLTestData C
    ON B.TestInstanceID = C.TestInstanceID AND A.TruthIdentity = C.TestIdentity AND A.XMLHierarchyLevelID = C.XMLHierarchyLevelID AND A.XMLNode = C.XMLNode AND A.TaskID = C.TaskID)
)

UNION

(SELECT C.TaskID, NULL, C.TestInstanceID, C.XMLHierarchyLevelID, C.XMLNode, NULL, C.XMLValue_Test
FROM AutomatedTest_XMLTruthData A
LEFT JOIN AutomatedTest_Auth B
ON A.TestCaseID = B.TestCaseID
FULL JOIN AutomatedTest_XMLTestData C
ON B.TestInstanceID = C.TestInstanceID AND A.TruthIdentity = C.TestIdentity AND A.XMLHierarchyLevelID = C.XMLHierarchyLevelID AND A.XMLNode = C.XMLNode AND A.TaskID = C.TaskID
WHERE B.ReconcileDate IS NULL AND C.TaskID IS NOT NULL)

EXCEPT
   (Select C.TaskID, NULL, C.TestInstanceID, C.XMLHierarchyLevelID, C.XMLNode, NULL, C.XMLValue_Test
    FROM AutomatedTest_XMLTruthData A
    INNER JOIN AutomatedTest_Auth B
    ON A.TestCaseID = B.TestCaseID
    INNER JOIN AutomatedTest_XMLTestData C
    ON B.TestInstanceID = C.TestInstanceID AND A.TruthIdentity = C.TestIdentity AND A.XMLHierarchyLevelID = C.XMLHierarchyLevelID AND A.XMLNode = C.XMLNode AND A.TaskID = C.TaskID)
))


UPDATE AutomatedTest_Auth
SET ReconcileDate = GETDATE()
WHERE (TestCaseID IN (Select TestCaseID FROM AutomatedTest_DataReconciliation WHERE TestCaseID IS NOT NULL)
OR TestInstanceID IN (Select TestInstanceID FROM AutomatedTest_DataReconciliation WHERE TestInstanceID IS NOT NULL))
AND ReconcileDate IS NULL

所以我有这个插入查询,用于检查两个表,一个测试和一个auth,并比较它们的行。它通过AutomatedTest_Auth表将测试表中的TestInstance与真值表中的TestCase进行匹配。

完成后,它会使用GETDATE()标记更新AutomatedTest_Auth表,以显示对帐过程已完成。插入在WHERE中检查这一点,以确保它不会插入任何已插入的内容,方法是确保ReconcileDate为NULL(在AutomatedTest_Auth表的新条目中默认为null)。

然而,我的问题是第二个“B.Reconcile IS NULL”无效。运行两次后,它将从第一次拾取的AutomatedTest_XMLTestData中获取相同的行并再次插入它们。 (只是注意,没有PK违规,因为调和列可能在任何时候重叠;它有一个标识列。)

这是一个操作顺序问题吗? ......一个bug?任何帮助都会很好。

此外,当我将B.ReconcileDate IS NULL更改为IS NOT NULL时,插入交换,它将从AutomatedTest_XMLTruthData而不是AutomatedTest_XMLTestData插入相同的行,因此我知道AutomatedTest_XMLTruthData的插入正确识别WHERE子句,并且AutomatedTest_XMLTestData错误地将B.ReconcileData IS NULL反转为IS NOT NULL。

1 个答案:

答案 0 :(得分:1)

您正在插入名为AutomatedTest_XMLReconciliation

的表格

更新where条件会查看名为AutomatedTest_DataReconciliation的表,该表未在脚本的其他位置引用。它是否正确?我认为更新应该是:

UPDATE AUTOMATEDTEST_AUTH 
SET    RECONCILEDATE = GETDATE() 
WHERE  ( TESTCASEID IN (SELECT TESTCASEID 
                        FROM   AUTOMATEDTEST_XMLRECONCILIATION 
                        WHERE  TESTCASEID IS NOT NULL) 
          OR TESTINSTANCEID IN (SELECT TESTINSTANCEID 
                                FROM   AUTOMATEDTEST_XMLRECONCILIATION 
                                WHERE  TESTINSTANCEID IS NOT NULL) ) 
       AND RECONCILEDATE IS NULL