SQL Три таблицы соединения - PullRequest
       9

SQL Три таблицы соединения

3 голосов
/ 19 февраля 2012

Я не могу решить эту проблему уже несколько дней, и я надеюсь, что вы можете помочь.

Я пытаюсь написать запрос, который возвращает всю информацию об акциях и их последнем обновлении. Я бы хотел отфильтровать результаты по параметру @date и вернуть только те акции, которые он обновляет последними, меньше, чем предоставленный параметр @date. Мне также нужны акции с нулевой отметкой времени, поэтому я знаю, что эти акции должны быть обновлены. У меня есть три таблицы, с которыми я работаю:

stocks
- id
- asset_id
- market_id
- name
- symbol
- IPOYear
- sector
- industry

updates
- id
- [timestamp]

stock_updates
- stock_id
- update_id

Я использовал следующий запрос, и он работал хорошо для меня, пока я не понял, что он не работает, если на складе нет обновления

select * from stocks s
where @date < (
    select top 1 u.timestamp from
        updates u,
        stock_updates su
    where
        s.id = su.stock_id and
        u.id = su.update_id
    order by u.timestamp desc
)

Так что после некоторого исследования я натолкнулся на внешние объединения, и я думаю, что это то, что мне нужно, чтобы решить мою проблему, я просто не смог построить правильный запрос. Самое близкое, что я получил, - это следующее, но он возвращает запись для каждого обновления акции. Заранее спасибо за помощь!

Вот где я сейчас нахожусь:

select * from stocks s 
left outer join stock_updates su on s.id = su.stock_id 
left outer join updates u on u.id = su.update_id 
where u.[timestamp] < @date

Ответы [ 4 ]

3 голосов
/ 19 февраля 2012
select s.*, u.timestamp
from stocks s 
left join 
(select  su.stock_id, MAX(u.timestamp) timestamp
from updates u 
inner join stock_updates su 
on u.id = su.update_id
group by su.stock_id
) as u
on s.id = u.stock_id
where u.[timestamp] is null or u.[timestamp] < @date
2 голосов
/ 19 февраля 2012

Возможно, что-то вроде этого?

SELECT s.*, v.timestamp
FROM stocks s
LEFT JOIN (
    SELECT MAX(u.timestamp) AS timestamp, su.stock_id
    FROM stock_updates su
    INNER JOIN updates u ON (u.id = su.update_id)
    GROUP BY su.stock_id
) v ON (v.stock_id = s.stock_id)

По сути, он просто соединяет таблицу stocks с "встроенным представлением", которое является результатом запроса для определения максимального значения timestamp для каждого * 1006.*.

1 голос
/ 19 февраля 2012

Я не включил никакую фильтрацию по параметру @date, поскольку ваш вопрос гласит:

"Я пытаюсь написать запрос, который возвращает всю информацию об акции и последнихвремя его обновления "

и для этого вам не требуется никакой фильтрации.

Этот запрос делает именно это:

select s.*, dr.maxtime,  
from stocks s  
left join (select MAX(u.timestamp) as maxtime, su.stock_id 
           from stock_updates su inner join updates u on u.id = su.update_id
           group by su.stock_id) dr
    on dr.stock_id = s.stock_id
where 
   maxtime < @date or maxtime is null 

[BTW: left join совпадает с left outer join]

0 голосов
/ 19 февраля 2012

Попробуйте это

select s.*, max(su.timestamp)
from
    stocks s
        left outer join
    stock_update su
        on (s.id = su.stock_id)
        left outer join
    updates u
        on (u.id = su.update_id)
group by s.*

Это написано на макушке. На что вы ссылаетесь с @date? Это значит "сейчас"? Вы имеете в виду последнюю временную метку или самую последнюю до @date?

...