比较两个表中的数据

时间:2011-03-09 21:30:07

标签: sql ibm-midrange rpgle

我需要比较两个表以确保值匹配。对于上下文,一个是员工的时间表,另一个是保存其请求的表。每个都有一个时间表代码和几个小时。我的计划是按摘要进行比较,看看它们是否匹配。但是,我每次都让我的逻辑完美地工作时遇到了问题。如果没有我发布我的代码(无论如何它很快就会变得一团糟),你会怎么做?比较需要能够以编程方式运行,最后返回true / false。

这可以是RPG解决方案或SQL解决方案。

这是我需要确保的。

Table 1
02  1.5
04  16.0

Table 2
02  1.5
04  16.0

问题出在何时

Table 1
02  1.5

Table 2
02  1.5
04  16.0

或何时

Table 1
02  1.5
04  16.0

Table 2
02  1.5

或更多

Table 1
02  1.5
04  16.0

Table 2

6 个答案:

答案 0 :(得分:1)

这将比较每个ID值的A和B中的总小时数,并且只返回B中的总和不等于A的记录。它将B的不匹配值视为零。

SELECT A.id, A.hours, SUM(COALESCE(B.Hours,0))
FROM A
LEFT OUTER JOIN B
  ON B.ID = A.ID
WHERE 1=1
  AND A.id = B.id
GROUP BY A.id
HAVING A.Hours != SUM(COALESCE(B.Hours,0))

Cheers,
Daniel

答案 1 :(得分:1)

这应该提供所要求的结果:

with w1 ( wid, sumHrs )
 as ( SELECT id, sum(hours)
        FROM A   a1
        GROUP BY id ),
     w2 ( wid, sumHrs )
 as ( SELECT id, sum(hours)
        FROM B  b1
        GROUP BY id )
 select '1', w1.wid from w1 INNER JOIN w2 
                                on w1.wid = w2.wid
                      where w1.sumHrs <> w2.sumHrs 
union
 select '2', w1.wid from w1 EXCEPTION JOIN w2 
                                on w1.wid = w2.wid
union
 select '3', w2.wid from w2 EXCEPTION JOIN w1 
                                on w2.wid = w1.wid 

可能需要进行细微的细节更改,因为我对样本进行了调整和简化,但这种情况很接近,但并不精确。但是,所有基本概念都应该清楚。

CTE提供了一些摘要“视图”,供完整陈述使用。 INNER JOIN为匹配的ID提供不匹配的HOURS。第一个EXCEPTION JOIN从第一个表中给出第二个表中没有匹配ID的行,第二个EXCEPTION JOIN给出在另一个方向上不匹配的行。并UNIONs收集所有结果。

答案 2 :(得分:0)

通常,如果合并两个表,并且结果表的计数与各个表的计数相同,则可以说它们具有相同的值。

我不确定如何申请,但也许你可以。

答案 3 :(得分:0)

最简单的解决方案显示冲突的行:

CREATE TABLE requests ( employees_id integer, hours decimal );
CREATE TABLE hours ( employees_id integer, hours decimal );

SELECT * FROM requests, hours WHERE requests.employees_id = hours.employees_id AND requests.hours != hours.hours;

但是如果例如它不起作用一个2h请求需要匹配两个1h标记。

答案 4 :(得分:0)

我最近做了类似的事情 - 这是我的笔记......结果集显示了值的差异加上一个表中存在但不存在于另一个表中的行。

步骤1:创建包含要比较的行的临时表。

步骤2:使用非聚合列作为匹配标准对临时表执行FULL OUTER JOIN。

DECLARE @Ta TABLE (PubA varchar(255), CampA varchar(255), RevA money)   

INSERT INTO @Ta (PubA, CampA, RevA)                     
    SELECT Publisher, [Campaign Name], SUM([Revenue USD])               
    FROM D1.dbo.Stats               
    GROUP BY Publisher, [Campaign Name]

DECLARE @Tb TABLE (PubB varchar(255), CampB varchar(255), RevB money)   

INSERT INTO @Tb (PubB, CampB, RevB)                     
    SELECT Publisher, [Campaign Name], SUM([Revenue USD])               
    FROM D2.dbo.Stats                   
    GROUP BY Publisher, [Campaign Name]

SELECT PubA, CampA, RevA, PubB, CampB, RevB, RevA-RevB DiffRev  
FROM @Ta                        
FULL OUTER JOIN @Tb                     
ON PubA=PubB and CampA=CampB                        
ORDER BY DiffRev DESC                       
GO  

答案 5 :(得分:0)

我将我的两个SQL结果放入视图中,然后基于许多人的反馈已经提出了这个。我认为这可以创建到它​​自己的存储过程中。

SELECT SUM ( ERROR_COUNT ) AS TOTAL_ERRORS INTO NUM_ERRORS FROM (
SELECT COUNT ( * ) AS ERROR_COUNT
FROM MPRLIB . V_TSHOURSUMM A EXCEPTION JOIN MPRLIB . V_REQHOURSUMM B
ON A . EM_NUMBER = B . EM_NUMBER AND A . TIMESHEET_CODE = B . TIMESHEET_CODE AND A.HOURS_SUMMARY = B . HOURS_SUMMARY
WHERE A . EM_NUMBER = EMPLOYEE_ID OR B . EM_NUMBER = EMPLOYEE_ID
UNION
SELECT COUNT ( * ) AS ERROR_COUNT
FROM MPRLIB . V_REQHOURSUMM A EXCEPTION JOIN MPRLIB . V_TSHOURSUMM B
ON A . EM_NUMBER = B . EM_NUMBER AND A . TIMESHEET_CODE = B . TIMESHEET_CODE AND A . HOURS_SUMMARY = B . HOURS_SUMMARY
WHERE A . EM_NUMBER = EMPLOYEE_ID OR B . EM_NUMBER = EMPLOYEE_ID ) TABLE

似乎有效,但似乎......过度了。思考?有没有更好的办法?