SQL中,事务表中的日期范围*不匹配*

时间:2015-09-21 12:55:42

标签: sql join transactions

无法理解我的想法:我希望主表中的所有行在事务表中没有匹配的事务行,对于给定的日期范围。例: 主表m:

id Name
1  John
2  David
3  Simon 
4  Jessica
5  Becky

交易表t

id parent date       action
1  1      2015-08-28 IN
2  1      2015-09-03 IN
3  2      2015-08-17 IN
4  2      2015-10-01 IN
5  4      2015-09-05 IN

我希望m中所有那些在9月没有任何交易的条目:所以我应该得到m.id 2,3,5

1 does not match: events in september
2 matches: events but none in  september
3 matches: no events at all
4 does not match: events in september
5 matches: No events at all

我可以通过左连接获得那些没有任何内容的东西,以及那些日期但不在范围内的那些,加入,但无法看到如何获得这两个条件。我可能只是在忙碌的一天。

2 个答案:

答案 0 :(得分:1)

通常,当我们尝试直接跳转到最终查询时,它应该变得更加复杂 - 如果它可以工作的话。一般来说,只对相关表格执行直接连接并查看结果并不会造成任何损害。如果没有别的,你验证连接是否正确:

$("input").change(function()
{
     $("input").removeAttr("required");
     $(this).attr("required","");
});

(请原谅我重命名你的一些字段。)我碰巧现在有了Oracle,你可以使用你拥有的任何东西。这个代码可能只适用于任何非Oracle系统,只需删除双重'来自CTE代码。

现在让我们扩展加入条件,但我们这样做是为了生成我们 希望看到的数据。

with
Master( ID, Name )as(
    select  1, 'John' from dual union all
    select  2, 'David' from dual union all
    select  3, 'Simon' from dual union all
    select  4, 'Jessica' from dual union all
    select  5, 'Becky' from dual
),
Trans( MasterID, EffDate, Action )as(
    select  1, date '2015-08-28', 'IN' from dual union all
    select  1, date '2015-09-03', 'IN' from dual union all
    select  2, date '2015-08-17', 'IN' from dual union all
    select  2, date '2015-10-01', 'IN' from dual union all
    select  4, date '2015-09-05', 'IN' from dual
)
select  *
from    Master  m
join    Trans   t
    on  t.MasterID  = m.ID;

我已经对日期值进行了硬编码,但这是用于获取日期值的最佳格式..."范围。从月的第一天的第一个刻度到下个月的第一天之前的绝对最后一个刻度中选择每个值。当然,您希望将这些值存储在变量中或立即生成它们。

现在我们只看到 9月期间发生的两个事务。显而易见的下一步是执行外部联接,以便我们获得所有其他不匹配的主记录。

join    Trans   t
    on  t.MasterID  = m.ID
    and t.EffDate >= date '2015-09-01'
    and t.EffDate < date '2015-10-01';

现在我们拥有了我们想要的所有记录,以及我们不想要的两个记录。由于它们是唯一符合日期限制的,我们添加过滤条件以删除它们。这是最终查询:

left join Trans   t

非常简单。一旦你完成了几次,你就可以跳到完成的查询而无需中间步骤。尽管如此,执行干预步骤并沿途查看输出并不会造成伤害。逻辑中的任何缺陷都会在更容易修复时被捕获。

答案 1 :(得分:0)

选择所有master,使用parent分组的事务连接(每个master条目产生0..1行)。

如果没有事务记录,t.parent将为null,这将转换为该主条目的无事务。

如果有交易条目,您将在t.a中找到该计数,如果其中一些是在9月,您将在t.m9

中找到它们

如果你想要所有主人没有任何交易,你可以过滤t.parent is null

如果你想在9月份没有交易的所有主人,你可以过滤t.parent is null or t.m9=0

select m.id, m.name, 
     , t.a, t.m9 
from master_table m
left join ( select a  = count(*)
                 , m9 = count(case when datepart(Month, t.date) = 9 then 1 end)
                 , t.parent 
            from transaction_table t 
            group by t.parent
          ) t on t.parent = m.id
where t.parent is null or t.m9=0