2012-05-23 40 views
0

我有多个请求,我想做一个简单的请求进行多个请求的一个请求

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

您使用的是什么RDBMS? – GarethD

+0

我正在使用Oracle – Mercer

回答

2

我认为这是可以简化为这样:

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比GROUP BY更有意义 –

2

单个插入应该工作:

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) */;