这些是我目前的结果
CustomerID OrderID Date TableFK
1 1 2017-01-05 1
1 2 2017-01-06 1
1 3 2017-01-10 1
2 4 2017-01-10 2
2 5 2017-01-09 2
2 6 2017-01-16 2
现在基本上我想要退回已经在2017-01-09'或之后下订单的客户
如果我使用
WHERE Orders.Date > '2017-01-09'
我显然得到了
CustomerID OrderID Date TableFK
1 3 2017-01-10 1
2 4 2017-01-10 2
2 5 2017-01-09 2
2 6 2017-01-16 2
但我正在寻找的输出是
CustomerID OrderID Date TableFK
2 4 2017-01-10 2
2 5 2017-01-09 2
2 6 2017-01-16 2
我怎样才能做到这一点?我有一个SQL小提琴http://sqlfiddle.com/#!9/3d55d/2
答案 0 :(得分:3)
使用having
子句:
select o.TableFK as CustomerId
from Orders o
group by o.TableFK
having min(o.Date) >= '2017-01-09';
(SQL小提琴是here。)
请注意,您不需要join
到Customers
,因为您想要的客户需要订购。
关于命名的评论。名称TableFK
实际上毫无意义。它根本没有描述该列。我很擅长外键与他们所指的主键同名,所以CustomerId
代替TableFK
。
答案 1 :(得分:0)
您可以使用内部联接和where子句来执行此操作。
在问题中使用小提琴的内容:
select o.* from orders o
inner join (
select tableFK, min(date) as firstOrder
from orders
group by tableFK ) f
on f.tableFK = o.tableFK
where f.firstOrder >= '17-01-09'
答案 2 :(得分:0)
我会检查客户是否在您的日期之前的订单表中有记录,如下所示:
SELECT *
FROM Customer c
INNER JOIN Orders o
ON c.CustomerID = o.TableFK
WHERE NOT EXISTS
(SELECT 1
FROM Orders
WHERE Orders.TableFK = o.TableFK
AND Date < '2017-01-09')
这应该与您创建的小提琴一起使用。