Bonsoir.
J'ai créé une requête à partir du QBE de LO Base (puis modifiée ensuite à la main). Elle est fonctionnelle mais il me semble qu'elle pourrait être optimisée par des jointures.
Son utilité est la suivante...
Un client a une adresse "normale" (dite de facturation) et éventuellement une adresse de livraison. Ces adresses sont enregistrées dans une table T_ADRESSES et leur type dans une table TR_ADRESSES_TY (ID 1 = facturation, ID 2 = livraison). Dans la table T_CLIENTS j'ai une colonne CLI_LIV (SMALLINT, 0 ou 1 autorisés) qui définit si le client a une adresse de livraison. Je sais que ça fait sûrement double emploi mais je n'ai pas encore trouvé comment faire autrement. Je pars du principe que le client se fait toujours livré à la même adresse et c'est pourquoi je n'ai pas choisi de placer cette colonne dans la facture.
Le but de la requête est de sélectionner la ligne d'adresse de livraison quand celle-ci existe...
Structure de la base, très simplifiée :
Requête :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 CREATE TABLE T_CLIENTS ( CLI_ID INTEGER GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1) NOT NULL, CLI_NOM VARCHAR (32) NOT NULL, CLI_PRENOM VARCHAR (32) NOT NULL, CLI_LIV SMALLINT NOT NULL, CONSTRAINT PK_CLI_ID PRIMARY KEY (CLI_ID), CONSTRAINT CC_CLI_LIV CHECK (CLI_LIV BETWEEN 0 AND 1) ); CREATE TABLE TR_LOCALITES ( LOC_ID INTEGER GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1) NOT NULL, LOC_CP CHAR (5) NOT NULL, LOC_LIB VARCHAR (32) NOT NULL, CONSTRAINT PK_LOC_ID PRIMARY KEY (LOC_ID), CONSTRAINT UC_LOC_CP_LIB UNIQUE (LOC_CP, LOC_LIB), CONSTRAINT CC_LOC_CP CHECK (CAST (LOC_CP AS INTEGER) BETWEEN 01000 AND 97680) ); CREATE TABLE TR_ADRESSES_TY ( ADT_ID INTEGER GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1) NOT NULL, ADT_LIB CHAR (24) NOT NULL, CONSTRAINT PK_ADT_ID PRIMARY KEY (ADT_ID) ); INSERT INTO TR_ADRESSES_TY (ADT_ID, ADT_LIB) VALUES (1, 'Adresse facturation'); INSERT INTO TR_ADRESSES_TY (ADT_ID, ADT_LIB) VALUES (2, 'Adresse livraison'); CREATE TABLE T_ADRESSES ( ADR_ID INTEGER GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1) NOT NULL, ADT_ID INTEGER NOT NULL, CLI_ID INTEGER NOT NULL, ADR_LIB VARCHAR (48) NOT NULL, LOC_ID INTEGER NOT NULL, CONSTRAINT PK_ADR_ID PRIMARY KEY (ADR_ID), CONSTRAINT FK_ADR_ADT FOREIGN KEY (ADT_ID) REFERENCES TR_ADRESSES_TY (ADT_ID), CONSTRAINT FK_ADR_PER FOREIGN KEY (CLI_ID) REFERENCES T_CLIENTS (CLI_ID), CONSTRAINT FK_ADR_LOC FOREIGN KEY (LOC_ID) REFERENCES TR_LOCALITES (LOC_ID) ); CREATE TABLE T_FACTURES ( FAC_ID INTEGER GENERATED BY DEFAULT AS IDENTITY (START WITH 1) NOT NULL, CLI_ID INTEGER NOT NULL, FAC_DATE DATE DEFAULT CURRENT_DATE NOT NULL, FAC_MNT DECIMAL (6,2) NOT NULL, CONSTRAINT PK_FAC_ID PRIMARY KEY (FAC_ID), CONSTRAINT FK_FAC_CLI FOREIGN KEY (CLI_ID) REFERENCES T_CLIENTS (CLI_ID) );
Merci.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 SELECT T_FACTURES.FAC_ID, T_FACTURES.FAC_DATE, T_FACTURES.CLI_ID, T_CLIENTS.CLI_NOM, T_CLIENTS.CLI_PRENOM, T_ADRESSES.ADR_ID, T_ADRESSES.ADT_ID, TR_ADRESSES_TY.ADT_LIB, CASE WHEN T_CLIENTS.CLI_LIV = 0 THEN TR_ADRESSES_TY.ADT_ID = 1 ELSE TR_ADRESSES_TY.ADT_ID = 2 END AS CLI_TEST, T_ADRESSES.ADR_LIB, TR_LOCALITES.LOC_CP, TR_LOCALITES.LOC_LIB, T_CLIENTS.CLI_LIV FROM T_ADRESSES, T_CLIENTS, T_FACTURES, TR_ADRESSES_TY, TR_LOCALITES WHERE T_ADRESSES.CLI_ID = T_CLIENTS.CLI_ID AND T_FACTURES.CLI_ID = T_CLIENTS.CLI_ID AND T_ADRESSES.ADT_ID = TR_ADRESSES_TY.ADT_ID AND T_ADRESSES.LOC_ID = TR_LOCALITES.LOC_ID AND CLI_TEST = 1 ORDER BY T_FACTURES.FAC_ID ASC
Partager