2012-05-23 5 views
0

j'ai une demande multiple et je veux faire une simple requêteFaire plusieurs requêtes dans une requête

INSERT INTO SERVICEPAYANT_CLIENT (RE_ID, TYPE_DONNEES) 
SELECT CLIENT_ID, 160 AS TYPE_DONNEES 
FROM REFERENTIEL r, CLIENT_APPLICATIF ca 
WHERE r.ID = ca.ID_REFERENTIEL 
AND r.TYPE=1 
AND NOT EXISTS (
    SELECT * FROM SERVICEPAYANT_CLIENT sp 
    WHERE sp.RE_ID = CLIENT_ID AND TYPE_DONNEES = 160) 
GROUP BY CLIENT_ID 
HAVING COUNT(*)>0; 

INSERT INTO SERVICEPAYANT_CLIENT (RE_ID, TYPE_DONNEES) 
SELECT CLIENT_ID, 161 AS TYPE_DONNEES 
FROM REFERENTIEL r, CLIENT_APPLICATIF ca 
WHERE r.ID = ca.ID_REFERENTIEL 
AND r.TYPE=1 
AND NOT EXISTS (
    SELECT * FROM SERVICEPAYANT_CLIENT sp 
    WHERE sp.RE_ID = CLIENT_ID AND TYPE_DONNEES = 161) 
GROUP BY CLIENT_ID 
HAVING COUNT(*)>0; 

INSERT INTO SERVICEPAYANT_CLIENT (RE_ID, TYPE_DONNEES) 
SELECT CLIENT_ID, 162 AS TYPE_DONNEES 
FROM REFERENTIEL r, CLIENT_APPLICATIF ca 
WHERE r.ID = ca.ID_REFERENTIEL 
AND r.TYPE=1 
AND NOT EXISTS (
    SELECT * FROM SERVICEPAYANT_CLIENT sp 
    WHERE sp.RE_ID = CLIENT_ID AND TYPE_DONNEES = 162) 
GROUP BY CLIENT_ID 
HAVING COUNT(*)>0; 

INSERT INTO SERVICEPAYANT_CLIENT (RE_ID, TYPE_DONNEES) 
SELECT CLIENT_ID, 163 AS TYPE_DONNEES 
FROM REFERENTIEL r, CLIENT_APPLICATIF ca 
WHERE r.ID = ca.ID_REFERENTIEL 
AND r.TYPE=1 
AND NOT EXISTS (
    SELECT * FROM SERVICEPAYANT_CLIENT sp 
    WHERE sp.RE_ID = CLIENT_ID AND TYPE_DONNEES = 163) 
GROUP BY CLIENT_ID 
HAVING COUNT(*)>0; 
+0

Quel RDBMS utilisez-vous? – GarethD

+0

J'utilise Oracle – Mercer

Répondre

2

Je pense que cela peut être simplifié comme si :

INSERT INTO SERVICEPAYANT_CLIENT (RE_ID, TYPE_DONNEES) 
SELECT DISTINCT 
     CLIENT_ID, 
     t.TYPE_DONNEES 
FROM REFERENTIEL r, 
     CLIENT_APPLICATIF ca, 
     ( SELECT 160 AS Type_Donnees FROM Dual UNION ALL 
      SELECT 161 AS Type_Donnees FROM Dual UNION ALL 
      SELECT 162 AS Type_Donnees FROM Dual UNION ALL 
      SELECT 163 AS Type_Donnees FROM Dual 
     ) t 
WHERE r.ID = ca.ID_REFERENTIEL 
AND  r.TYPE = 1 
AND  NOT EXISTS 
     ( SELECT 1 
      FROM SERVICEPAYANT_CLIENT sp 
      WHERE sp.RE_ID = CLIENT_ID 
      AND  t.TYPE_DONNEES = sp.TYPE_DONNEES 
     ) 
+0

+1: DISTINCT est plus significatif dans ce cas que GROUP BY –

2

Un seul insert devrait fonctionner:

INSERT INTO SERVICEPAYANT_CLIENT (RE_ID, TYPE_DONNEES) 
SELECT CLIENT_ID, T.TYPE_DONNEES 
    FROM (SELECT 160 TYPE_DONNEES FROM dual UNION ALL 
     SELECT 161 FROM dual UNION ALL 
     SELECT 162 FROM dual UNION ALL 
     SELECT 163 FROM dual) t, 
     REFERENTIEL r, 
     CLIENT_APPLICATIF ca 
WHERE r.ID = ca.ID_REFERENTIEL 
    AND r.TYPE = 1 
    AND NOT EXISTS (SELECT * 
        FROM SERVICEPAYANT_CLIENT sp 
        WHERE sp.RE_ID = CLIENT_ID 
         AND TYPE_DONNEES = T.TYPE_DONNEES) 
GROUP BY T.TYPE_DONNEES, CLIENT_ID 
/* HAVING COUNT(*) > 0 (unnecessary) */; 
Questions connexes