2012-02-19 88 views
3

我幾天來一直無法解決這個問題,我希望你能幫上忙。SQL三表加入

我想寫一個查詢,返回有關股票的所有信息和上次更新。我想根據參數@date過濾結果,並只返回最近更新的股票比提供的@date參數少。我還需要時間戳爲空的股票,所以我知道這些股票需要更新。我有我的工作的follwing三個表:

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 

回答

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

謝謝@jbrooks回覆!這幾乎可以工作,並且完全按照我在問題中提出的要求,它將使用最新的時間戳返回所有股票,包括時間戳爲空。不過,我忽略了添加的問題,我需要添加日期參數來選擇只有未通過日期更新的股票。當我取消註釋WHERE子句時,出現錯誤,因此我在「s.id = u.stock_id」之後移動它,並且它返回所有股票的最新時間戳記更新,但前提是它們有時間戳記。 – robson 2012-02-19 01:33:07

+0

謝謝@Jbrooks。現在完美的作品非常感謝! – robson 2012-02-19 02:34:45

1

我還沒有包括由@date參數任何過濾,因爲你的問題狀態

「我想寫一個查詢返回有關 股票和上次更新的所有信息「

並且因此您不需要y過濾。

這個查詢正是這麼做的:

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

我打算添加它,但重新閱讀問題海報說:「我試圖編寫一個查詢,返回有關股票的所有信息以及上次更新的時間。 – 2012-02-19 00:31:57

+2

這就是這些碰到的問題 - 沒有OP的澄清,很多正確的解決方案,沒有人看到他們的努力。真是浪費。 =/ – Yuck 2012-02-19 00:39:17

+0

謝謝@MitchWheat小麥。這與我最初描述的完全一樣,但我需要添加一個WHERE子句,它將僅返回最後一次更新的股票在提供的日期參數之前。當我在dr之後添加WHERE dr.maxtime <日期時。stock_id = s.stock_id它正確過濾,但不包括時間戳爲null的股票。非常感謝你的幫助。 – robson 2012-02-19 01:30:59

2

像這樣的事情吧?

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表「內聯視圖」,也就是一個查詢的結果來確定每個stock_id最大timestamp

+0

@@ Yuck:這不是OP問題所陳述的...... – 2012-02-19 00:35:38

+0

@Yuck:...並且完全不必要。我假設他們錯誤地創造了它。 – 2012-02-19 00:38:47

+0

@MitchWheat哈哈我也這麼做了。 – Yuck 2012-02-19 00:42:38

0

試試這個

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