查询根据SQL

时间:2017-09-20 13:02:11

标签: sql db2

我有2张桌子。 ProfileInfo(ProfileID - PK)和EmployeeRole(EmpID - PK,ProfileID - FK)。两者都使用ProfileID连接,两个表都有LastUpdatedTimestamp列。我需要从两个表中获取数据,使用from和lastupdated时间戳。

  

有时两个表都会同时更新   只有一个得到更新

。这是我尝试过但它会显示两个表上更新的数据。首先,我尝试加入,但它没有像我想的那样工作

     select emp.emp_id as EmpId from EmployeeRole emp 
     FULL OUTER JOIN ProfileInfo pi on emp.profile_id = pi.profile_id
     where emp.LST_UPDT_TS between '2017-09-18' and '2017-09-20' and 
     pi.LST_UPDT_TS between '2017-09-18' and '2017-09-20';

这使得两个表格都发生了变化。

表详情:
EmployeeRole Emp_ID PK,Profile_id FK,LST_UPDT_TS TIMESTAMP

ProfileInfo Profile_Id PK,Profile_name,LST_UPDT_TS TIMESTAMP

示例:如果更新了ProfileInfo的2条记录,并且更新了1条EmployeeRole记录。考虑到ProfileInfo中的记录与EmployeeRole记录无关,我需要获得3个emp_id。如果其中一个记录是相关的,那么我必须只获得2个emp_id。

我在短时间内搜索了类似的答案但没有任何效果。请帮忙。

2 个答案:

答案 0 :(得分:1)

这只是一个例子,您的条件可能会有所不同

   SELECT
       -- common data
       COALESCE(emp.profile_id, pi.profile_id) as profile_id
      ,COALESCE(emp.LST_UPDT_TS, pi.LST_UPDT_TS) as LST_UPDT_TS
       -- emp role
      ,emp.emp_id as EmpId
       -- profile
      , pi.Profile_name
  FROM (SELECT * 
        FROM EmployeeRole 
        WHERE LST_UPDT_TS between '2017-09-18' and '2017-09-20') emp 
  FULL OUTER JOIN (
        SELECT * 
        FROM  ProfileInfo 
        WHERE LST_UPDT_TS between '2017-09-18' and '2017-09-20') pi
     -- rows matching predicate
      ON emp.profile_id = pi.profile_id
     AND emp.LST_UPDT_TS = pi.LST_UPDT_TS 

答案 1 :(得分:0)

这适用于我改变的初始查询中的一些小问题。

select emp.emp_id as EmpId from EmployeeRole emp  
 JOIN ProfileInfo pi on emp.profile_id = pi.profile_id and
 ((emp.LST_UPDT_TS between '2017-09-18' and '2017-09-20') or 
 (pi.LST_UPDT_TS between '2017-09-18' and '2017-09-20'));

非常感谢@Serg和@Phil以及@wildplasser