限制mysql中的内部连接

限制mysql中的内部连接,mysql,sql,inner-join,Mysql,Sql,Inner Join,表A Calid | EffectiveFrom --- 2 | 10 Jun 2016 --- 5 | 20 Nov 2016 ------ 7 | 05 Jan 2017 -- Calid 2将由6月10日起的人员跟随,Calid 5将由11月20日起跟随,依此类推 表B包含calid的详细信息(所有工作日期) 因此,calid 7的所有工作日期都存在。将生成一份报告,以查找遵循calid的人员的总工作日,如表A所

表A

Calid |        EffectiveFrom  
---
2       |     10 Jun 2016
---
5       |     20 Nov 2016
------
7       |    05 Jan 2017
--
Calid 2将由6月10日起的人员跟随,Calid 5将由11月20日起跟随,依此类推

表B包含calid的详细信息(所有工作日期)

因此,calid 7的所有工作日期都存在。将生成一份报告,以查找遵循calid的人员的总工作日,如表A所示。报告应包含如下天数 校准日期(见表B)。 这是通过select语句实现的(因为它是视图的一部分,所以没有过程)。在表A中,我没有effectiveToDate列


详情: 表B包含给定年份的所有工作日(读取日期)。Calid是特定日历的日历id。假设calid 2表示日本所有工作日的列表,calid 5给出迪拜一年所有工作日/日期的列表。一名员工从日本到迪拜在不同的地点移动,因此他/她的工作日也会相应改变。年底时,应计算员工应工作多少天。 表A包含一年内员工日历变动的历史记录。在员工移动到另一个地点并开始遵循不同地点日历的当天添加一个条目。EffectiveFrom表示特定日历的起始日期。 这段逻辑将与视图中的另一个代码放在一起,因此视图的限制是完整的


正如@philipxy所评论的那样,我对问题进行了编辑以使其清晰明了。

我终于明白了!CTE

WITH Cte (EmpNo, calid, dtEffectiveDate,number)AS
         (SELECT EmpNo, calid, dtEffectiveDate,row_number() over(order by EmpNo,dtEffectiveDate)
               FROM TableA WHere EmpNo in (1741285 ) 
         )
         , OuterCte (EmpNo, calid, dtEffectiveDate,number,dtEffectiveToDate) As
         (Select d.*,IsNull(d2.dteffectiveDate-1,Convert(Date,DATEADD(YEAR, DATEDIFF(YEAR,0,GETDATE()) + 2, -1)) ) as dtEffectiveToDate
           from Cte d
           left outer join Cte d2 on d.number = (d2.number-1)
         )
    SELECT  EmpNo,WorkingDate,WorkingDescription
    FROM      OuterCte CAL  ON ELA.EmpNo = CAL.EmpNo        
    INNER JOIN TableB HCD WITH(NOLOCK)    ON HCD.calid = CAl.calid
    AND  HCD.dtHolidayDate between cal.dtEffectiveDate and cal.dtEffectiveToDate

你的帖子不清楚。请使用完整的简单句子,而不是像“(所有工作日期)”和“12月31日之前所有工作日期都存在”这样的片段。我们必须猜猜你想说什么。表B是否仅适用于2016年?这和一个孩子有什么关系?是否是2016年信息,但列出了每个工作日?那为什么2号和5号不在6月和11月开始呢?“没有程序,因为它是视图的一部分”是什么意思?为什么说“在表A中,我没有有效的截止日期列”?我们知道。也不清楚行何时进入a、B或结果。你的问题是什么?你能做什么?你被困在哪里?@KaranShah我马上就要完成了…万岁!CTE是线索。将于周一向您提供最终更新。Gn.这就是我尝试过的,并且它是有效的:)@philipxy似乎你的问题帮助我得到了答案,多亏了你!另外,我编辑了问题文本来回答你的问题“橡皮鸭”案例?人们很少在不清楚的情况下改进自己的职位。你的不太清楚,所以我投了反对票。我否决的问题几乎从未被编辑过,更不用说足够清晰,我想撤销否决票,更不用说足够清晰,我想向上投票。所以祝贺你的努力。(这可能更简洁。)要了解如何简明扼要地解释“当一行进入a、B或结果时”,请参阅我的答案中的谓词。例如&。
WITH Cte (EmpNo, calid, dtEffectiveDate,number)AS
         (SELECT EmpNo, calid, dtEffectiveDate,row_number() over(order by EmpNo,dtEffectiveDate)
               FROM TableA WHere EmpNo in (1741285 ) 
         )
         , OuterCte (EmpNo, calid, dtEffectiveDate,number,dtEffectiveToDate) As
         (Select d.*,IsNull(d2.dteffectiveDate-1,Convert(Date,DATEADD(YEAR, DATEDIFF(YEAR,0,GETDATE()) + 2, -1)) ) as dtEffectiveToDate
           from Cte d
           left outer join Cte d2 on d.number = (d2.number-1)
         )
    SELECT  EmpNo,WorkingDate,WorkingDescription
    FROM      OuterCte CAL  ON ELA.EmpNo = CAL.EmpNo        
    INNER JOIN TableB HCD WITH(NOLOCK)    ON HCD.calid = CAl.calid
    AND  HCD.dtHolidayDate between cal.dtEffectiveDate and cal.dtEffectiveToDate