检查生产中是否存在行集

时间:2013-02-20 20:28:39

标签: sql

我有两个类似的表,一个在制作中,另一个在正在进行中。

我需要将一组记录从正在进行的工作复制到生产中。如果生产中已存在类似的记录集,我无法复制。

相反,我需要获取匹配行的id。

因此,在尝试复制之前,我首先检查相似的记录集是否正在生产中。

以下是示例

生产表中的标准

CriteriaId    CriteriaVal    CriteriaText

1               42               SAM

1               43               Guess

2               324              Sale

2               432              Jones

2               423              Patrick

2               4322             Tiffany

正在进行的工作中的标准

CriteriaId    CriteriaVal    CriteriaText

41               42               SAM

41               43               Guess

42               324              Sale

42               432              Jones

42               423              Patrick

42               4322             Tiffany

43               42               SAM

442               324              Sale

442               432              Jones

442               423              Patrick

442               4322             Tiffany

442               3432             SAM

在上面的例子中,正在进行的工作中的标准id 41和42与标准id 1& 2在生产中。

所以,在我尝试将41复制到prod之前,当我检查它是否存在于prod中时,我需要得到id 1与41相同。

此外,正在进行的工作中的id 442与2不同,因为它有一个额外的行。我需要计数以及值应该完全匹配。

我正在尝试在SQL查询中执行,但我无法执行此操作。

关于如何跨表匹配一组记录的任何指针都会有所帮助。

3 个答案:

答案 0 :(得分:1)

一种策略(SQL2005及更高版本):

select a,b,c from InProgress
EXCEPT
select a,b,c from Production

或者:

select a,b,c, min(criteriaID), max(criteriaID)
from (
    SELECT criteriaID, a,b,c from InProgress
    UNION ALL
    SELECT criteriaID, a,b,c from Production
) t group by a,b,c having min(criteriaID) <> max(criteriaID)

答案 1 :(得分:0)

这种语法通常可以完成工作。

insert into table1
(field1, field2, etc)
from table2
where not exists
(subquery to check for exsiting records)

答案 2 :(得分:0)

以下是我用来解决此问题的查询。

        SELECT CriteriaId FROM CRITERIA JBCRV1, (
            SELECT DISTINCT JBCRV2.CriteriaId AS CRITERIAID 
            FROM WIPCRITERIA JWBCRV1 
            INNER JOIN CRITERIA JBCRV2
                ON    JWBCRV1.CriteriaVal= JBCRV2.CriteriaVal
                AND   JWBCRV1.CriteriaText = JBCRV2.CriteriaText
            WHERE  JWBCRV1.CriteriaId = #{CriteriaId}
            GROUP BY JBCRV2.CriteriaId HAVING COUNT(1) = 
                (SELECT COUNT(1) 
                 FROM WIPCRITERIA 
                 WHERE CriteriaId = #{CriteriaId} ) 
        ) RESULT_TABLE
        WHERE JBCRV1.CriteriaId = RESULT_TABLE.CRITERIAID
        GROUP BY JBCRV1.BEN_CRTR_ID HAVING COUNT(1) = 
                (SELECT COUNT(1) 
                 FROM WIPCRITERIA 
                 WHERE CriteriaId = #{CriteriaId} )

我已经测试过各种条件&amp;这项工作。

感谢所有试图帮助我的人。