2017-07-18 60 views
0

我在一个名为#MPR的表中有一组记录。我试图完成的是找到表中的任何记录在另一个名为#Lookup的表中有重叠日期,并且具有匹配的ProviderID,Sub Type,CauseID和CircuitID。如果是这样,请返回#MPR表中的所有记录以及#Lookup表中的相应重叠记录,其中包含以下列LookupID,BegDate,EndDate和Amt。查找从一个表到另一个表的冲突重叠日期

-- Create Temporary Table 
CREATE TABLE #MPR 

(
MprID int IDENTITY(1,1), 
ProviderID int, 
RowNo int, 
SubType varchar(50), 
CauseID int, 
CircuitID int, 
BegDate date, 
EndDate date, 
Amt decimal(11,2), 
Remarks varchar(max) 
) 

--Insert records 

INSERT INTO #MPR VALUES(673,2,'Original',439,4852,'2016-12-01','2016-12-31',100,'Rec A') 
INSERT INTO #MPR VALUES(673,15,'Original',439,4852,'2016-12-21','2016-12-31',200,'Rec B') 
INSERT INTO #MPR VALUES(100,21,'Original',500,5000,'2016-12-01','2016-12-01',300,'Rec C') 
INSERT INTO #MPR VALUES(673,24,'Original',439,4852,'2016-12-05','2017-01-31',400,'Rec D') 

-- Create Temporary Table 
CREATE TABLE #Lookup 

(
LookupID int IDENTITY(1,1), 
ProviderID int, 
SubType varchar(50), 
CauseID int, 
CircuitID int, 
BegDate date, 
EndDate date, 
Amt decimal(11,2), 
) 

--Insert records 
INSERT INTO #Lookup Values(673,'Original',439,4852,'2016-10-01','2016-10-31',200.00) 
INSERT INTO #Lookup Values(100,'Original',500,5000,'2016-10-01','2016-10-31',200.00) 
INSERT INTO #Lookup Values(100,'Original',500,5000,'2016-10-01','2016-11-30',200.00) 
INSERT INTO #Lookup Values(673,'Original',439,4852,'2016-11-01','2016-11-30',200.00) 
INSERT INTO #Lookup Values(673,'Original',439,4852,'2016-12-01','2016-12-31',200.00) 
INSERT INTO #Lookup Values(673,'Original',439,4852,'2017-01-01','2017-01-31',200.00) 
INSERT INTO #Lookup Values(100,'Original',500,5000,'2016-12-01','2016-12-31',200.00) 
INSERT INTO #Lookup Values(673,'Original',439,6565,'2017-01-01','2017-01-31',200.00) 

--Drop table #mpr 
--Drop table #Lookup 

我的结果:

MprID  ProviderID RowNo  SubType CauseID  CircuitID BegDate EndDate Amt  LookupID BegDate EndDate Amt 
----------- ----------- ----------- -------- ----------- ----------- ---------- ---------- --------- ----------- ---------- ---------- -------- 
1   673   2   Original 439   4852  2016-12-01 2016-12-31 100.00 5   2016-12-01 2016-12-31 200.00 
2   673   15   Original 439   4852  2016-12-21 2016-12-31 200.00 5   2016-12-01 2016-12-31 200.00 
3   100   21   Original 500   5000  2016-12-01 2016-12-01 300.00 7   2016-12-01 2016-12-31 200.00 
4   673   24   Original 439   4852  2016-12-05 2017-01-31 400.00 5   2016-12-01 2016-12-31 200.00 
4   673   24   Original 439   4852  2016-12-05 2017-01-31 400.00 6   2017-01-01 2017-01-31 200.00 
+1

请看看[这里](https://stackoverflow.com/questions/325933/determine-whether-two-date-ranges-overlap/325964#325964)这样的问题。 –

+0

当你说“返回#MPR表中的所有记录”时,这有点令人困惑。你是指所有专栏?如果你想查看更多的行,那么这些行与那些与'#Lookup'表重叠的行如何关联? – ErikE

+0

@ErikE,你可以在下面的帖子中找出我需要的。这正是我需要的。 –

回答

2

什么?如果我正确地读出你的规格,这将做你想做的。请注意,到目前为止,它只使用两个条件而不是四个。

SELECT 
    m.*, 
    l.LookupId, 
    l.BegDate, 
    l.EndDate, 
    l.Amt 
FROM 
    #MPR m 
    INNER JOIN #Lookup l 
     ON m.ProviderID = l.ProviderID 
     AND m.SubType = l.SubType 
     AND m.CauseID = l.CauseID 
     AND m.CircuitID = l.CircuitID 
WHERE 
    m.BegDate < l.EndDate 
    AND l.BegDate < m.EndDate 
; 
1

我认为这会做你想要

select * 
from #mpr M 
inner join #Lookup L 
on M.ProviderID = L.ProviderID 
AND M.SubType = L.SubType 
AND M.CauseID = L.CauseID 
AND M.CircuitID = L.CircuitID 
AND (M.BegDate BETWEEN L.BegDate AND L.EndDate OR L.BegDate BETWEEN M.BegDate AND M.EndDate) 
+0

这有4个条件(BETWEEN是幕后的OR语句)。在2种情况下查看我的答案。 – ErikE