SQL三表连接

时间:2012-02-19 00:21:28

标签: sql join left-join

我现在几天都无法解决这个问题,我希望你能提供帮助。

我正在尝试编写一个查询,该查询返回有关库存和上次更新的所有信息。我想根据参数@date过滤结果,只返回它最近更新的股票小于提供的@date参数。我还需要时间戳为null的股票,所以我知道这些股票需要更新。我正在使用以下三个表格:

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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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表加入“内联视图”,这是查询的结果,用于确定每个timestamp的最大stock_id

答案 2 :(得分:1)

我没有在@date参数中包含任何过滤,因为您的问题是

  

“我正在尝试编写一个返回有关a的所有信息的查询   库存和最后一次更新“

为此您不需要任何过滤。

此查询正是如此:

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 joinleft outer join]

相同

答案 3 :(得分: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之前的最新时间戳?