2009-07-17 5 views
1

Ich habe eine Reihe von Bestandsdatensätzen.SQL Select mit Ausnahme einiger Bereiche

Ich habe auch eine Reihe von Daten für die, obwohl ich Daten haben könnte, kann ich keine Aktien handeln.

Hier ist die Probe DDL für das Setup:

create table #stock_data 
(
    symbol varchar (10) NOT NULL, 
    asof datetime NOT NULL, 
    price float NOT NULL 
) 
go 

insert into #stock_data values ('IBM', '7/1/09', 100) 
insert into #stock_data values ('IBM', '7/2/09', 100) 
insert into #stock_data values ('IBM', '7/3/09', 100) 
insert into #stock_data values ('IBM', '7/4/09', 100) 
insert into #stock_data values ('IBM', '7/5/09', 100) 
insert into #stock_data values ('IBM', '7/6/09', 100) 
insert into #stock_data values ('IBM', '7/7/09', 100) 
insert into #stock_data values ('IBM', '7/8/09', 100) 
insert into #stock_data values ('IBM', '7/9/09', 100) 

insert into #stock_data values ('MSFT', '7/1/09', 50) 
insert into #stock_data values ('MSFT', '7/2/09', 50) 
insert into #stock_data values ('MSFT', '7/3/09', 50) 
insert into #stock_data values ('MSFT', '7/4/09', 50) 
insert into #stock_data values ('MSFT', '7/5/09', 50) 
insert into #stock_data values ('MSFT', '7/6/09', 50) 
insert into #stock_data values ('MSFT', '7/7/09', 50) 
insert into #stock_data values ('MSFT', '7/8/09', 50) 
insert into #stock_data values ('MSFT', '7/9/09', 50) 
go 

create table #exclude_ranges 
(
    symbol varchar (10) NOT NULL, 
    asof_start datetime NOT NULL, 
    asof_end datetime NOT NULL 
) 
go 


insert into #exclude_ranges values ('IBM', '7/2/09', '7/2/09') 
insert into #exclude_ranges values ('IBM', '7/6/09', '7/8/09') 
insert into #exclude_ranges values ('MSFT', '7/1/09', '7/8/09') 

go 

Und hier ist die SELECT ich will. Ich weiß, es muß einige clevere Art und Weise, dies zu tun, aber ich kann ganz es nicht herausgefunden .....

select * from #stock_data 
join ???? 
where ???? 

zurückzukehren
('IBM', '7/1/09', 100) 
('IBM', '7/3/09', 100) 
('IBM', '7/4/09', 100) 
('IBM', '7/5/09', 100) 
('IBM', '7/9/09', 100) 
('MSFT', '7/9/09', 50) 

Also, was Magie geht in die? ??? Blöcke?

Antwort

5
SELECT * 
FROM #stock_data sd 
LEFT JOIN #exclude_ranges er 
    ON sd.symbol=er.symbol and sd.asof BETWEEN er.asof_start AND er.asof_end 
WHERE er.symbol IS NULL 
+1

Heh, grabe ich die rückwärts Logik dieser Abfrage. Verknüpfen Sie die Ausschlusseinträge in die Einträge, die sie ausschließen, und nehmen Sie dann die verbleibenden Einträge. – Dave

+0

Ehrfürchtig. Äußere Verbindung FTW! –

1

Try this ...

select * from stock_data s 
left join exclude_ranges e 
    on e.symbol = s.symbol 
    and s.asof between e.asof_start and e.asof_end 
Where e.symbol is null