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 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
|
drop table destination_lien;
drop table destination;
drop table theme;
create table theme
(
theme_id int not null primary key,
theme_nom varchar(50) not null,
theme_alternate bit not null
);
create table destination
(
destination_id int not null primary key,
destination_nom varchar(50) not null,
theme_id int not null references theme(theme_id)
);
create table destination_lien
(
destination_lien_id int identity not null primary key,
destination_mere int not null references destination(destination_id),
destination_fille int not null references destination(destination_id),
constraint ck_destination_lien check (destination_mere <> destination_fille),
constraint cu_destonation_lien unique (destination_mere, destination_fille)
);
go
create trigger trg_destination_lien on destination_lien
after insert
as
begin
if (select count(*) from inserted) > 0
begin
insert into destination_lien (destination_mere, destination_fille)
select distinct dl1.destination_mere, i.destination_fille
from inserted i
inner join destination d on d.destination_id = i.destination_fille
inner join theme t on t.theme_id = d.theme_id and t.theme_alternate = 1
inner join destination_lien dl1 on dl1.destination_fille = i.destination_mere
inner join destination_lien dl2 on dl2.destination_mere = dl1.destination_mere
where not exists (select null from destination_lien dl where dl.destination_mere = dl1.destination_mere and dl.destination_fille = i.destination_fille);
end;
end;
go
-- Les thèmes
insert into theme (theme_id, theme_nom, theme_alternate) values (1, 'Continent', 0);
insert into theme (theme_id, theme_nom, theme_alternate) values (2, 'Pays', 0);
insert into theme (theme_id, theme_nom, theme_alternate) values (3, 'Ville', 0);
insert into theme (theme_id, theme_nom, theme_alternate) values (4, 'Bord de mer', 1);
insert into theme (theme_id, theme_nom, theme_alternate) values (5, 'Montagne', 1);
-- Les destinations
insert into destination (destination_id, destination_nom, theme_id) values (1, 'Europe', 1);
insert into destination (destination_id, destination_nom, theme_id) values (2, 'Asie', 1);
insert into destination (destination_id, destination_nom, theme_id) values (3, 'France', 2);
insert into destination (destination_id, destination_nom, theme_id) values (4, 'Espagne', 2);
insert into destination (destination_id, destination_nom, theme_id) values (5, 'Italie', 2);
insert into destination (destination_id, destination_nom, theme_id) values (6, 'Corée', 2);
insert into destination (destination_id, destination_nom, theme_id) values (7, 'Brest', 3);
insert into destination (destination_id, destination_nom, theme_id) values (8, 'Nice', 3);
insert into destination (destination_id, destination_nom, theme_id) values (9, 'Rome', 3);
insert into destination (destination_id, destination_nom, theme_id) values (10, 'Chamonix', 3);
insert into destination (destination_id, destination_nom, theme_id) values (11, 'Gunsan', 3);
insert into destination (destination_id, destination_nom, theme_id) values (12, 'Mediterranée', 4);
insert into destination (destination_id, destination_nom, theme_id) values (13, 'Atlantique', 4);
insert into destination (destination_id, destination_nom, theme_id) values (14, 'Mer de Chine', 4);
insert into destination (destination_id, destination_nom, theme_id) values (15, 'Pyrénnées', 5);
insert into destination (destination_id, destination_nom, theme_id) values (16, 'Alpes', 5);
insert into destination (destination_id, destination_nom, theme_id) values (17, 'Roses', 3);
insert into destination (destination_id, destination_nom, theme_id) values (18, 'Suisse', 2);
insert into destination (destination_id, destination_nom, theme_id) values (19, 'Genève', 3);
-- Les liens
-- Europe
insert into destination_lien (destination_mere, destination_fille) values (1, 3);
insert into destination_lien (destination_mere, destination_fille) values (1, 4);
insert into destination_lien (destination_mere, destination_fille) values (1, 5);
insert into destination_lien (destination_mere, destination_fille) values (1, 18);
-- Asie
insert into destination_lien (destination_mere, destination_fille) values (2, 6);
-- France
insert into destination_lien (destination_mere, destination_fille) values (3, 7);
insert into destination_lien (destination_mere, destination_fille) values (3, 8);
insert into destination_lien (destination_mere, destination_fille) values (3, 10);
-- Espagne
insert into destination_lien (destination_mere, destination_fille) values (4, 17);
-- Italie
insert into destination_lien (destination_mere, destination_fille) values (5, 9);
-- Suisse
insert into destination_lien (destination_mere, destination_fille) values (18, 19);
-- Corée
insert into destination_lien (destination_mere, destination_fille) values (6, 11);
-- Brest
insert into destination_lien (destination_mere, destination_fille) values (7, 13);
-- Nice
insert into destination_lien (destination_mere, destination_fille) values (8, 12);
insert into destination_lien (destination_mere, destination_fille) values (8, 16);
-- Rome
insert into destination_lien (destination_mere, destination_fille) values (9, 12);
-- Chamonix
insert into destination_lien (destination_mere, destination_fille) values (10, 16);
-- Gunsan
insert into destination_lien (destination_mere, destination_fille) values (11, 14);
-- Roses
insert into destination_lien (destination_mere, destination_fille) values (17, 15);
insert into destination_lien (destination_mere, destination_fille) values (17, 12);
-- Genève
insert into destination_lien (destination_mere, destination_fille) values (19, 16);
-- Maintenant, on se connecte à l'application. Le point d'entrée, c'est toutes les destinations qui ne sont jamais filles :
select d.destination_id, d.destination_nom
from destination d
where d.destination_id not in (select dl.destination_fille from destination_lien dl);
/*
destination_id destination_nom
-------------- --------------------------------------------------
1 Europe
2 Asie
*/
-- Ok, on part pour l'Europe
select t.theme_nom, d.destination_id, d.destination_nom
from destination_lien dl
inner join destination d on d.destination_id = dl.destination_fille
inner join theme t on t.theme_id = d.theme_id
where dl.destination_mere = 1;
/*
theme_nom destination_id destination_nom
-------------------------------------------------- -------------- --------------------------------------------------
Pays 3 France
Pays 4 Espagne
Pays 5 Italie
Bord de mer 12 Mediterranée
Bord de mer 13 Atlantique
Montagne 15 Pyrénnées
Montagne 16 Alpes
Pays 18 Suisse
*/
-- Le mieux est de créer une liste par thème, pour plus de clareté
-- On part pour la méditerranée
select t.theme_nom, d1.destination_id, d1.destination_nom
from destination_lien dl
inner join destination d1 on d1.destination_id = dl.destination_fille
inner join destination_lien d2 on d2.destination_mere = d1.destination_id
inner join theme t on t.theme_id = d1.theme_id
where dl.destination_mere = 1
and d2.destination_fille = 12;
/*
theme_nom destination_id destination_nom
-------------------------------------------------- -------------- --------------------------------------------------
Pays 3 France
Pays 4 Espagne
Pays 5 Italie
*/
-- La Suisse a disparu puisque qu'elle n'est pas au borde de la méditerranée
-- Je choisi maintenant la France
select t.theme_nom, d1.destination_id, d1.destination_nom
from destination_lien dl
inner join destination d1 on d1.destination_id = dl.destination_fille
inner join destination_lien d2 on d2.destination_mere = d1.destination_id
inner join theme t on t.theme_id = d1.theme_id
where dl.destination_mere = 3
and d2.destination_fille = 12;
/*
theme_nom destination_id destination_nom
-------------------------------------------------- -------------- --------------------------------------------------
Ville 8 Nice
*/
-- Il ne me reste plus que Nice |
Partager