2009-09-18 9 views
0

Quelqu'un peut-il m'aider à réécrire la requête suivante sans utiliser l'instruction UNION?Requête SQL sans UNION

(
    SELECT 
    A.QRYNAME0 "Query Name", 
    A.OPRID, 
    A.DESCR, 
    A.QRYTYPE, 
    TO_CHAR(A.CREATEDTTM,'DD-MON-YYYY HH24:MI:SS') "Created On", 
    TO_CHAR(A.LASTUPDDTTM,'DD-MON-YYYY HH24:MI:SS') "Last Updated On", 
    B.EXECCOUNT "No of Times Executed", 
    B.AVGEXECTIME, 
    TO_CHAR(B.LASTEXECDTTM,'DD-MON-YYYY HH24:MI:SS') "Last Executed On" 
    --TO_CHAR(SUBSTR(A.DESCRLONG,1,50))"Long Description" 
    FROM 
    PSQRYDEFN A, 
    PSQRYSTATS B 
    WHERE 
    A.QRYNAME = B.QRYNAME and 
    a.oprid = b.oprid 
) 
UNION 
(
    SELECT 
    A.QRYNAME "Query Name", 
    A.OPRID, 
    A.DESCR, 
    A.QRYTYPE, 
    TO_CHAR(A.CREATEDTTM,'DD-MON-YYYY HH24:MI:SS') "Created On", 
    TO_CHAR(A.LASTUPDDTTM,'DD-MON-YYYY HH24:MI:SS') "Last Updated On", 
    0 "No of Times Executed", 
    0, 
    NULL "Last Executed On" 
    --TO_CHAR(SUBSTR(A.DESCRLONG,1,50)) "Long Description" 
    FROM 
    PSQRYDEFN A 
    WHERE 
    NOT EXISTS (
     SELECT 1 
     FROM PSQRYSTATS B 
     WHERE a.qryname = b.qryname and a.oprid = b.oprid 
    ) 
) 
+1

Uniquement si vous fournissez les instructions DDL utilisées pour créer les tables et si vous décrivez le résultat souhaité de la requête. –

+0

Je pense que si vous le formatez d'une manière plus lisible et faites ressortir la différence, vous aurez plus de chances d'obtenir une réponse. –

+1

essayé de reformater. Aucune idée si c'est mieux maintenant, je n'écris pas trop de SQL à la main. – Joey

Répondre

1

Il semble que vous simuliez une jointure externe gauche. Essayez

A.QRYNAME *= B.QRYNAME and 
a.oprid *= b.oprid 

ou mieux encore, le rendre ANSI conforme

FROM PSQRYDEFN A 
LEFT OUTER JOIN PSQRYSTATS B ON A.QRYNAME=B.QRYNAME AND A.oprid=B.oprid 
+0

yup, je recommande de lire sur la jointure externe. –

+0

... et nouvelle syntaxe de jointure –

0

Je pense que vous êtes à la recherche de jointure externe gauche et isnull/fonctions NVL mais sans connaître le dialecte de SQL et les tables ne peuvent pas être exacte

SELECT 
    A.QRYNAME0 "Query Name", 
    A.OPRID, 
    A.DESCR, 
    A.QRYTYPE, 
    TO_CHAR(A.CREATEDTTM,'DD-MON-YYYY HH24:MI:SS') "Created On", 
    TO_CHAR(A.LASTUPDDTTM,'DD-MON-YYYY HH24:MI:SS') "Last Updated On", 
    nvl(B.EXECCOUNT, 0) "No of Times Executed", 
    nvl(B.AVGEXECTIME, 0) 
    nvl(TO_CHAR(B.LASTEXECDTTM,'DD-MON-YYYY HH24:MI:SS'), null) "Last Executed On" 
    --TO_CHAR(SUBSTR(A.DESCRLONG,1,50))"Long Description" 
FROM 
    PSQRYDEFN A left outer join PSQRYSTATS B 
    on A.QRYNAME = B.QRYNAME and 
     a.oprid = b.oprid 
+0

Merci pour la réponse, S'il vous plaît vérifier la requête et laissez-moi savoir si je peux l'utiliser de cette façon (SELECT DISTINCT A.QRYNAME "Nom de la requête", A.OPRID, A.DESCR , A.QRYTYPE, TO_CHAR (A.CREATEDTTM, 'DD-MON-YYYY HH24: MI: SS') "Créé le", TO_CHAR (A.LASTUPDDTTM, 'DD-MON-YYYY HH24: MI: SS') "Dernière Mis à jour sur", 0 "Nombre de fois exécutés", 0, NULL "Dernière exécution activée" --TO_CHAR (SUBSTR (A.DESCRLONG, 1,50)) "Description longue" FROM PSQRYDEFN A, PSQRYSTATS B O WH A.NAME = B.QRYNAME et a.oprid = b.oprid OU NOT EXISTS (SELECT 1 FROM PSQRYSTATS B où a.qr yname = b.qryname et a.oprid = b.oprid)) –

+0

peut-être, je voudrais l'essayer -. Je ne suis pas certain ici car je trouve la jointure externe beaucoup plus facile à lire que le ou. Dans la nouvelle requête, je pense que vous aurez besoin d'ajouter des parenthèses autour du et c'est à dire où (.. et ...) ou .... – Mark

0

on dirait que vous aurez besoin d'une jointure externe gauche des deux tables, plus vous aurez besoin de mutiler les valeurs EXECCOUNT et EXECAVGTIME avec NVL pour convertir à nulls zéros.