2017-09-28 1 views
0

J'ai 3 tables,SQL: comment obtenir la première condition de correspondance de ligne de l'une ou l'autre table?

Questions

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

Revues

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

Détails sur la revue

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

Journals et Journal details des tables sont utilisées pour maintenir Issue histoire.

Si un attribut de problème est mis à jour, une entrée journal est créée avec journal details pour chaque attribut mis à jour. Et si seulement une note est ajoutée à issue, seule l'entrée journal est créée avec cette note.

Maintenant, je veux obtenir le premier enregistrement de journal pour le problème où note est ajouté ou assigned_to_id est modifié.

Je fais cela par 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 

mais il ne renvoient que l'entrée journalnotes est présent.

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

J'ai essayé LEFT JOIN et LEFT OUTER JOIN mais même résultat.

Une idée de comment je peux y parvenir?

+2

Quelle dbms utilisez-vous? Ne pas étiqueter les produits non impliqués ... – jarlh

+0

J'utilise Postgresql –

+0

si vous utilisez jointure externe et bon ordre, je suis sûr qu'il retournera toutes les lignes –

Répondre

1

cela devrait fonctionner

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