2012-02-19 13 views
3

私はこの問題を数日間は解決できませんでした。SQL 3テーブルへの参加

私は、株式に関する最新情報と更新された最新情報を返すクエリを作成しようとしています。 @dateパラメータに基づいて結果をフィルタリングし、最新の更新情報が指定された@dateパラメータ未満の株式のみを返したいと思います。私はまた、タイムスタンプがゼロの株式を必要とするので、論文の株式を更新する必要があることを知っています。私は次のクエリを使用してきたと私は在庫が持っていない場合、それは仕事をdosen't実現するまで、それは私のためによく働いていた

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

updates 
- id 
- [timestamp] 

stock_updates 
- stock_id 
- update_id 

:私は私が働いているfollwing 3つのテーブルを持っています更新

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 
) 

だからいくつかの研究の後、私はaccross外部結合と私はそれは私がちょうど正しいクエリを作成することができていない私の問題を修正するために必要なものだと思いました。私が一番近かったのは以下のことですが、在庫が更新されるたびにレコードが返されます。あなたの助けを前もってありがとう!

私は今でてる場所です:私はあなたの質問の状態として、@dateパラメータによって任意のフィルタリングを含めていない

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さん、ありがとうございました!これはほとんど動作し、私が質問で尋ねたことを正確に行います。タイムスタンプがnullの場合を含め、すべての株式を最新のタイムスタンプで返します。しかし私は、渡された日付から更新されていない株式だけを選択するために日付パラメータを追加する必要があるという質問を追加することを怠った。 WHERE句のコメントを外したときにエラーが発生したので、 "s.id = u.stock_id"の後に移動し、最新のタイムスタンプの更新ですべての株を返しましたが、タイムスタンプがある場合にのみ返しました。 – robson

+0

ありがとう@Jブルック。これは完璧に今、とても感謝しています! – robson

1

「私が書くしようとしています 株および最後に更新された株式に関するすべての情報を返すクエリ "

このため、 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 

:おそらくこのような[ところで:left joinleft outer joinと同じである]

+0

私はそれを追加しようとしていましたが、質問のポスターを読んで、「株式に関するすべての情報と更新された最後の情報を返すクエリを書こうとしています。 –

+2

これは、ヒットアンドランの質問の問題です。つまり、OPからの解明、正しい解決策がたくさんあります。誰も自分の努力のために何も見ていません。どのような無駄。 =/ – Yuck

+0

ありがとう@MitchWheat小麦。これは最初の記述とまったく同じですが、WHERE句を追加する必要があります。WHERE句は、指定された日付パラメータの前に最後に更新された株式のみを返します。 dr.maxtime <日付をdrの後に追加します。stock_id = s.stock_idは正しくフィルタリングされますが、タイムスタンプがNULLの株は含まれません。助けてくれてありがとう。 – robson

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) 

基本的にはちょうど各stock_idの最大timestampを決定するためにクエリの結果が「インライン・ビュー」にstocksテーブルを結合。

+0

@@ Yuck:それはOPの質問にもかかわらず.... –

+0

@Yuck:...そして完全には必要ありません。私は彼らが誤ってそれを作成したと仮定しています。 –

+0

@MitchWheat私は同じことをしました。 – Yuck

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より前の最新の時刻を意味しますか?

関連する問題