SQL 包含多个字段的 Where In 子句
SQL Where In clause with multiple fields
我有一个 table 如下。
id date value
1 2011-10-01 xx
1 2011-10-02 xx
...
1000000 2011-10-01 xx
然后我有 1000 个 ID,每个 ID 都与一个日期相关联。我想执行如下操作:
SELECT id, date, value
FROM the table
WHERE (id, date) IN ((id1, <= date1), (id2, <= date2), (id1000, <= date1000))
实现上述查询的最佳方法是什么?
您没有指定您的 DBMS,所以这是标准的 SQL。
你可以这样做:
with list_of_dates (id, dt) as (
values
(1, date '2016-01-01'),
(2, date '2016-01-02'),
(3, date '2016-01-03')
)
select
from the_table t
join list_of_dates ld on t.id = ld.id and t.the_date <= ld.dt;
这假定您在日期列表中没有重复项。
更新 - 现在 DBMS 已经公开。
对于 SQL 服务器,您需要将其更改为:
with list_of_dates (id, dt) as (
values
select 1, cast('20160101' as datetime) union all
select 2, cast('20160102' as datetime) union all
select 3, cast('20160103' as datetime)
)
select
from the_table t
join list_of_dates ld on t.id = ld.id and t.the_date <= ld.dt;
因为这是提前知道的信息,所以建立这个信息的临时 table 然后加入它
create table #test(id int, myDate date)
insert into #test(id,myDate) values
(1, '10/1/2016'),
(2, '10/2/2016'),
(3, '10/3/2016')
select a.id, a.date, a.value
from table as a
inner join
#test as b on a.id=b.id and a.date<=b.myDate
我有一个 table 如下。
id date value
1 2011-10-01 xx
1 2011-10-02 xx
...
1000000 2011-10-01 xx
然后我有 1000 个 ID,每个 ID 都与一个日期相关联。我想执行如下操作:
SELECT id, date, value
FROM the table
WHERE (id, date) IN ((id1, <= date1), (id2, <= date2), (id1000, <= date1000))
实现上述查询的最佳方法是什么?
您没有指定您的 DBMS,所以这是标准的 SQL。
你可以这样做:
with list_of_dates (id, dt) as (
values
(1, date '2016-01-01'),
(2, date '2016-01-02'),
(3, date '2016-01-03')
)
select
from the_table t
join list_of_dates ld on t.id = ld.id and t.the_date <= ld.dt;
这假定您在日期列表中没有重复项。
更新 - 现在 DBMS 已经公开。
对于 SQL 服务器,您需要将其更改为:
with list_of_dates (id, dt) as (
values
select 1, cast('20160101' as datetime) union all
select 2, cast('20160102' as datetime) union all
select 3, cast('20160103' as datetime)
)
select
from the_table t
join list_of_dates ld on t.id = ld.id and t.the_date <= ld.dt;
因为这是提前知道的信息,所以建立这个信息的临时 table 然后加入它
create table #test(id int, myDate date)
insert into #test(id,myDate) values
(1, '10/1/2016'),
(2, '10/2/2016'),
(3, '10/3/2016')
select a.id, a.date, a.value
from table as a
inner join
#test as b on a.id=b.id and a.date<=b.myDate