我有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。
我在短时间内搜索了类似的答案但没有任何效果。请帮忙。
答案 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