1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| CREATE TABLE T_CLIENT_CLI
(CLI_ID INT NOT NULL PRIMARY KEY IDENTITY,
CLI_NOM VARCHAR(16),
CLI_PRENOM VARCHAR(16))
INSERT INTO T_CLIENT_CLI VALUES ('FREDERIC', 'BROUARD')
INSERT INTO T_CLIENT_CLI VALUES ('FRED', 'ERICERAMZY')
INSERT INTO T_CLIENT_CLI VALUES ('PAUL', 'DUPONT')
INSERT INTO T_CLIENT_CLI VALUES ('PAUL', NULL)
INSERT INTO T_CLIENT_CLI VALUES (NULL, NULL)
CREATE TABLE T_PROSPECT_PSP
(PSP_ID INT NOT NULL PRIMARY KEY IDENTITY,
PSP_NOM VARCHAR(16),
PSP_PRENOM VARCHAR(16))
INSERT INTO T_PROSPECT_PSP VALUES ('FREDERIC', 'BROUARD')
INSERT INTO T_PROSPECT_PSP VALUES ('FREDERIC', 'ERAMZY')
INSERT INTO T_PROSPECT_PSP VALUES ('MARC', 'DUPONT')
INSERT INTO T_PROSPECT_PSP VALUES ('PAUL', 'DUBOIS')
INSERT INTO T_PROSPECT_PSP VALUES (NULL, 'DUBOIS')
INSERT INTO T_PROSPECT_PSP VALUES ('PAUL', NULL)
INSERT INTO T_PROSPECT_PSP VALUES (NULL, NULL)
-- première tentative :
SELECT *
FROM T_CLIENT_CLI
WHERE CLI_NOM + CLI_PRENOM IN (SELECT PSP_NOM + PSP_PRENOM
FROM T_PROSPECT_PSP)
CLI_ID CLI_NOM CLI_PRENOM
----------- ---------------- ----------------
1 FREDERIC BROUARD
2 FRED ERICERAMZY
-- mauvaises réponses : la concaténation en VARCHAR à provoqué un téléscopage de données et
-- touvé une valeur absurde !
-- transtypaons avec un CHAR d'un caractère plus large :
SELECT *
FROM T_CLIENT_CLI
WHERE CAST(CLI_NOM AS CHAR(17)) + CAST(CLI_PRENOM AS CHAR(17))
IN (SELECT CAST(PSP_NOM AS CHAR(17)) + CAST(PSP_PRENOM AS CHAR(17))
FROM T_PROSPECT_PSP)
CLI_ID CLI_NOM CLI_PRENOM
----------- ---------------- ----------------
1 FREDERIC BROUARD
--> excellent réponse
-- avec un EXISTS (plus relationnel):
SELECT *
FROM T_CLIENT_CLI C
WHERE EXISTS(SELECT *
FROM T_PROSPECT_PSP P
WHERE P.PSP_NOM = C.CLI_NOM
AND P.PSP_PRENOM = C.CLI_PRENOM )
-- plus simple avec un INTERSECT (version 2005)
SELECT CLI_NOM, CLI_PRENOM
FROM T_CLIENT_CLI
INTERSECT
SELECT PSP_NOM, PSP_PRENOM
FROM T_PROSPECT_PSP
-- plus simple encore avec une jointure :
SELECT C.*
FROM T_CLIENT_CLI C
INNER JOIN T_PROSPECT_PSP P
ON P.PSP_NOM = C.CLI_NOM
AND P.PSP_PRENOM = C.CLI_PRENOM |
Partager