我有两个类似的表,一个在制作中,另一个在正在进行中。
我需要将一组记录从正在进行的工作复制到生产中。如果生产中已存在类似的记录集,我无法复制。
相反,我需要获取匹配行的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查询中执行,但我无法执行此操作。
关于如何跨表匹配一组记录的任何指针都会有所帮助。
答案 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;这项工作。
感谢所有试图帮助我的人。