2017-09-28 10 views
0

私は3つのテーブルを持って、SQL:いずれかのテーブルから最初の行の一致条件を取得するには?

問題

|id|subject|assigned_to_id| 
--------------------------- 
|1 |test | 1   | 
|2 |test1 | NULL   | 
|3 |test3 | 2   | 

ジャーナル

|id|issue_id|notes| 
------------------- 
|1 |1  |NULL | 
|2 |1  |test1| 
|3 |2  |test | 

ジャーナルの詳細

|id|journal_id|prop_key  |old_value|value| 
---------------------------------------------- 
|1 |1   |assigned_to_id|NULL  |1 | 

JournalsおよびJournal detailsテーブルは、Issueの履歴を維持するために使用されています。

issueの一部の属性が更新された場合、更新された属性ごとにjournalエントリがjournal detailsとともに作成されます。また、issueにメモが追加された場合は、そのメモでjournalのエントリのみが作成されます。

noteが追加されたか、assigned_to_idが変更された問題の最初のジャーナルレコードを取得します。

私はjoin

SELECT "journals".* FROM "journals" INNER JOIN "journal_details" ON "journal_details"."journal_id" = "journals"."id" WHERE "journals"."issue_id" = 1 AND ((journals.notes != '' AND journals.notes IS NOT NULL) OR (journal_details.prop_key = 'assigned_to_id' AND journal_details.value IS NOT NULL)) ORDER BY journals.id asc 

経由でこれをやっているが、それは唯一のnotesが存在するjournalエントリを返します。

|id|issue_id|notes| 
------------------- 
|2 |1  |test1| 

私はLEFT JOINLEFT OUTER JOINが、同じ結果をしようとしています。

どのように私はこれを達成することができますか?

+2

を動作するはず?関連していない製品にタグを付けないでください。 – jarlh

+0

外部結合と正しい順序を使用する場合、私はPostgresql –

+0

を使用しています。すべての行が返されると確信しています –

答えて

1

これはあなたのDBMSを使用している

SELECT TOP 1 * 
FROM journals j 
left JOIN journal_det jd ON jd.journal_id = j.id 
WHERE j.issue_id = 1 
AND (
    (j.notes <> '' AND j.notes IS NOT NULL) 
    OR ((jd.prop_key = 'assigned_to_id' AND jd.value IS NOT NULL)) 
    ) 
ORDER BY j.id ASC 
関連する問題