2016-12-20 5 views
1

У меня есть таблица, как показано ниже.SQL Where In с несколькими полями

id   date   value 

1   2011-10-01 xx 

1   2011-10-02 xx 
... 

1000000  2011-10-01 xx 

Тогда у меня есть 1000 идентификаторов, каждый из которых ассоциируется с датой. Я хотел бы выполнить что-то, как показано ниже:

SELECT id, date, value 
FROM the table 
WHERE (id, date) IN ((id1, <= date1), (id2, <= date2), (id1000, <= date1000)) 

Каков наилучший способ достичь вышеуказанного запроса?

+0

ли вы имеете в виду : 'где (id, date) IN ((1, дата '2016-01-01'), (2, '2016-01-02'), ...)' Что именно означает '<=' делать? –

+0

Я хочу дату до или равную дате, которую я предоставил. SQL Server. – nkhuyu

ответ

5

Вы не указали свою СУБД, поэтому это стандартный 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; 

Это предполагает, что у вас нет дубликатов в списке дат.


Update - теперь, когда СУБД была раскрыта.

Для SQL Server необходимо изменить, что:

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; 
+0

Не так стандартно. MySQL не поддерживает WITH. Многие базы данных (например, Oracle, Teradata, MySQL ...) не поддерживают это использование VALUES. –

+0

@DuduMarkovitz: это стандарт 100% ANSI SQL –

+0

Как мы знаем, существует ОГРОМНОЕ различие между ANSI и «поддерживается» :-) –

1

, поскольку это информация известна заранее создать временную таблицу этой информации, а затем присоединиться к нему

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 
Смежные вопросы