-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path08-Self-JOIN.sql
More file actions
142 lines (112 loc) · 3.8 KB
/
Copy path08-Self-JOIN.sql
File metadata and controls
142 lines (112 loc) · 3.8 KB
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
/*
Working with Self JOIN
https://sqlzoo.net/wiki/Self_join
database: https://sqlzoo.net/wiki/Edinburgh_Buses
*/
--#1
/*
How many stops are in the database.
*/
SELECT COUNT(*) FROM stops
--#2
/*
Find the id value for the stop 'Craiglockhart'
*/
SELECT id FROM stops WHERE name = 'Craiglockhart'
--#3
/*
Give the id and the name for the stops on the '4' 'LRT' service.
*/
SELECT stop.*
FROM stops stop
JOIN route ON route.stop = stop.id
WHERE num = '4' AND company = 'LRT'
--#4
/*
The query shown gives the number of routes that visit either London Road (149) or Craiglockhart (53).
Run the query and notice the two services that link these stops have a count of 2.
Add a HAVING clause to restrict the output to these two routes.
*/
SELECT company, num, COUNT(*) AS visits
FROM route WHERE stop=149 OR stop=53
GROUP BY company, num
HAVING visits = 2
--#5
/*
The shown query gives all the places you can get to from Craiglockhart (53), without changing routes:
SELECT a.company, a.num, a.stop, b.stop
FROM route a JOIN route b ON
(a.company=b.company AND a.num=b.num)
WHERE a.stop=53
Change the query so that it shows the services from Craiglockhart to London Road.
*/
SELECT a.company, a.num, a.stop, b.stop
FROM route a
JOIN route b ON
(a.company=b.company AND a.num=b.num)
JOIN stops stop ON
(stop.id = b.stop AND stop.name = 'London Road')
WHERE a.stop=53
--#6
/*
The query shown is similar to the previous one,
however by joining two copies of the stops table
we can refer to stops by name rather than by number:
SELECT a.company, a.num, stopa.name, stopb.name
FROM route a JOIN route b ON
(a.company=b.company AND a.num=b.num)
JOIN stops stopa ON (a.stop=stopa.id)
JOIN stops stopb ON (b.stop=stopb.id)
WHERE stopa.name='Craiglockhart'
Change the query so that the services between 'Craiglockhart' and 'London Road' are shown.
*/
SELECT a.company, a.num, stopa.name, stopb.name
FROM route a JOIN route b ON
(a.company=b.company AND a.num=b.num)
JOIN stops stopa ON (a.stop=stopa.id)
JOIN stops stopb ON (b.stop=stopb.id)
WHERE stopa.name='Craiglockhart' AND stopb.name = 'London Road'
--#7
/*
Give a list of all the services which connect stops 115 and 137 ('Haymarket' and 'Leith')
*/
SELECT DISTINCT r1.company, r1.num
FROM route r1
JOIN route r2 ON (r1.num, r1.company) = (r2.num, r2.company)
JOIN stops a ON r1.stop = a.id AND a.id = 115
JOIN stops b ON r2.stop = b.id AND b.id = 137
--#8
/*
Give a list of the services which connect the stops 'Craiglockhart' and 'Tollcross'
*/
SELECT DISTINCT r1.company, r1.num
FROM route r1
JOIN route r2 ON (r1.num, r1.company) = (r2.num, r2.company)
JOIN stops a ON r1.stop = a.id AND a.name = 'Craiglockhart'
JOIN stops b ON r2.stop = b.id AND b.name = 'Tollcross'
--#9
/*
Give a distinct list of the stops which may be reached from 'Craiglockhart' by taking one bus,
including 'Craiglockhart' itself, offered by the LRT company.
Include the company and bus no. of the relevant services.
*/
SELECT r1.company, r1.num, a.name, b.name
FROM route r1
JOIN route r2 ON (r1.num, r1.company) = (r2.num, r2.company)
JOIN stops a ON r1.stop = a.id AND a.name = 'Craiglockhart'
JOIN stops b ON r2.stop = b.id
--#10
/*
Find the routes involving two buses that can go from Craiglockhart to Lochend.
Show the bus no. and company for the first bus, the name of the stop for the transfer,
and the bus no. and company for the second bus.
*/
SELECT r1.num, r1.company, c.name, r3.num, r3.company
FROM route r1
JOIN route r2 ON (r1.num, r1.company) = (r2.num, r2.company)
JOIN stops a ON r1.stop = a.id AND a.name = 'Craiglockhart'
JOIN stops b ON r2.stop = b.id
JOIN route r3
JOIN route r4 ON (r3.num, r3.company) = (r4.num, r4.company)
JOIN stops c ON r3.stop = c.id AND c.id = b.id
JOIN stops d ON r4.stop = d.id AND d.name = 'Lochend'