2017-10-17 2 views
0

alors j'essaie de faire fonctionner une requête depuis une demi-heure maintenant et je suis désespérée. Le problème est que je veux joindre une table à ma requête que je génère dans une sous-requête. La sous-requête était censé se présenter comme suit:En utilisant un alias dans une sous-requête jointe OU en rejoignant une seule ligne dans Oracle

left join (select  ACCN.*, 
         ROW_NUMBER() over (order by 
              case 
               when sysdate between ACCN.BDate and ACCN.EDate then 0 
               else 1 
              end, ACCN.EDate desc) as CNT 
          from  AccountContracts ACCN 
          where  ACCN.AccId = ACC.Id 
          order by case 
             when sysdate between ACCN.BDate and ACCN.EDate then 0 
             else 1 
             end, ACCN.EDate desc) ACN on ACN.CNT = 1 

L'idée ici est que, tandis qu'un compte peut être connecté à plusieurs contrats, je veux seulement montrer soit le contrat actif (sysdate between ACCN.AcnBDate and ACCN.AcnEDate) ou celui qui a expiré plus récemment. Par conséquent, je choisis les contrats pertinents, je les commande en conséquence, et au final, je ne prends en compte que le premier.

Toutefois, cela ne fonctionne pas car je ne peux pas référencer l'alias ACC dans la sous-requête. Je pourrais, bien sûr, passer la clause where à la clause on, mais dans ce cas, l'autre condition ne produirait pas le résultat attendu.

Je soit besoin d'être en mesure de faire référence à l'alias dans mon sous-requête, choisissez seule la ligne avec le plus bas CNT dans mon on -clause, ou penser à un autre, une meilleure solution (qui pourrait très bien exister).

Quelqu'un peut-il vous aider?

Merci d'avance!

+1

données d'échantillons d'exposition de votre table. –

+0

que voulez-vous dire, spécifiquement? –

+0

Afficher des lignes de données pour différentes colonnes impliquées. –

Répondre

0
  1. Sélectionnez les contrats en cours.
  2. Sélectionnez les contrats les plus récents pour les comptes qui n'ont pas de contrat en cours.
  3. UNION ces deux listes.

Essayez ceci:

-- Get all current contracts 
;WITH current_contracts AS (
     SELECT  ACCN.AccId 
        ,ACCN.ContractId -- Replace with relevant column name 
     FROM   AccountContracts ACCN 
     WHERE sysdate BETWEEN ACCN.BDate AND ACCN.EDate 
), 
recent_contracts AS (
     SELECT  ACCN.AccId 
        ,ACCN.ContractId 
     FROM  AccountContracts ACCN 
     WHERE 
     -- Exclude current_contracts 
     NOT EXISTS (
       SELECT 1 
       FROM current_contracts c 
       WHERE ACCN.AccId = c.AccId 
     ) 
     -- Most recent contracts 
     AND ACCN.Edate = (
          SELECT MAX(EDate) 
          FROM AccountContracts m 
          WHERE m.AccId = ACCN.AccId 
          ) 

     UNION 

     SELECT AccId 
       ,ContractId 
     FROM current_contracts 
) 

SELECT Acc.Id, r.AccId, r.ContractId 
FROM leftTable ACC 
LEFT JOIN recent_contracts r 
    ON ACC.Id = r.AccId 

;