我有一个简单的表,其中包含4列:
我正在尝试返回至少具有以下两个条件之一的所有电影ID:
该表如下所示:
order_id movie_id rent_date return_date
1 1 2014-07-17 NULL
2 1 2014-07-18 NULL
3 1 2014-07-19 2014-07-17
4 2 2014-07-17 2014-07-18
5 2 2014-07-17 2014-07-18
6 3 2014-07-17 NULL
7 3 2014-07-18 2014-07-19
我要返回以下电影ID:
任何帮助将不胜感激。
答案 0 :(得分:1)
您可以尝试以下操作
select t1.rent_date,t1.movie_id from t t1 join t t2
on t1.rent_date=t2.return_date and t1.movie_id=t2.movie_id and t1.order_id!=t2.order_id
union
select t1.rent_date, t1.movie_id from t t1
where t1.return_date IS NOT NULL
group by t1.rent_date,t1.movie_id
having count(*)>1
答案 1 :(得分:0)
创建简单表
declare @simple table
(
order_id int,
movie_id int,
rent_date date,
return_date date
)
一些简单的数据
insert into @simple values
(1, 1, '2014-07-17', NULL),
(2, 1, '2014-07-18', NULL),
(3, 1, '2014-07-19', '2014-07-17'),
(4, 2, '2014-07-17', '2014-07-18'),
(5, 2, '2014-07-17', '2014-07-18'),
(6, 3, '2014-07-17', NULL),
(7, 3, '2014-07-18', '2014-07-19')
查询
select distinct movie_id
from @simple t
where exists -- Rule 1
(
select rent_date
from @simple x
where return_date is not null
and movie_id = t.movie_id
group by rent_date
having count(*) = 2
)
or exists -- Rule 2
(
select *
from @simple x
where x.movie_id = t.movie_id
and x.rent_date = t.return_date
)
答案 2 :(得分:0)
1)同一部电影在同一日期订购了两次(只要返回日期不为空)
这可以通过将movie-id和rent-date分组并添加hading参数(HAVING COUNT(*)> = 1)来完成
2)同一部电影的订购日期与返回的日期相同(2个不同的订购ID-第一个电影ID的租借日期是第二个电影ID的返还日期)
这可以通过将表本身连接起来并将两个条件添加到join语句中来完成。 tabele1.movie_id = table2.movie_id和tabele1.rent_date = tabele2.return_date。还应添加两个订单ID应该不同
这将产生两个表,您可以在其中收集movie_id和rent-date。如果将两个表与一个UNION(而不是UNION ALL)结合使用,则会得到唯一的结果。
我不由自主地想到了类似下面的代码。
SELECT movie_id, rent_date
FROM movies table1
JOIN movies table2 ON tabele1.movie_id = table2.movie_id
AND tabele1.rent_date = tabele2.rent_date
GROUP BY movie_id, rent_date
HAVING COUNT(*) > 1
UNION
SELECT movie_id, rent_date
FROM movies table1
JOIN movies table2 ON tabele1.movie_id = table2.movie_id
AND tabele1.rent_date = tabele2.return_date
AND tabele1.order_id <> tabele2.order_id
GROUP BY movie_id, rent_date
要获取唯一的movie-id,您可以将其用作CTE或内部查询,并在movie_id,rent_date上添加GROUP BY。