-
Notifications
You must be signed in to change notification settings - Fork 0
/
self_join.sql
102 lines (87 loc) · 2.87 KB
/
self_join.sql
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
-- TUTORIAL
-- 1. How many stops are in the database.
SELECT COUNT(id)
FROM stops;
-- 2. id value for the stop 'Craiglockhart'
SELECT id
FROM stops
WHERE name = 'Craiglockhart';
-- 3. id and the name for the stops on the '4' 'LRT' service.
SELECT id, name
FROM stops
INNER JOIN route
ON stops.id = route.stop
WHERE route.num = '4' AND route.company = 'LRT';
-- 4. Number of routes that visit either London Road (149) or Craiglockhart (53).
SELECT company, num, COUNT(*)
FROM route
WHERE stop = 149 OR stop = 53
GROUP BY company, num
HAVING COUNT(*) = 2;
-- 5. Services from Craiglockhart to London Road.
SELECT a.company, a.num, a.stop, b.stop
FROM route a
INNER JOIN route b
ON a.company = b.company AND a.num = b.num
WHERE a.stop = 53 AND b.stop = 149;
-- 6. Services between 'Craiglockhart' and 'London Road'
SELECT a.company, a.num, stopa.name, stopb.name
FROM route a
INNER JOIN route b
ON a.company = b.company AND a.num = b.num
INNER JOIN stops stopa
ON a.stop = stopa.id
INNER JOIN stops stopb
ON b.stop = stopb.id
WHERE stopa.name = 'Craiglockhart' AND stopb.name = 'London Road';
-- 7. List of all the services which connect stops 115 and 137 ('Haymarket' and 'Leith')
SELECT DISTINCT a.company, b.num
FROM route a
INNER JOIN route b
ON a.company = b.company AND a.num = b.num
WHERE a.stop = 115 AND b.stop = 137;
-- 8. List of the services which connect the stops 'Craiglockhart' and 'Tollcross'
SELECT a.company, a.num
FROM route a
INNER JOIN route b
ON a.company = b.company AND a.num = b.num
INNER JOIN stops stopa
ON a.stop = stopa.id
INNER JOIN stops stopb
ON b.stop = stopb.id
WHERE stopa.name = 'Craiglockhart' AND stopb.name = 'Tollcross';
-- 9. Distinct list of the stops which may be reached from 'Craiglockhart' by taking one bus,
-- including 'Craiglockhart' itself, offered by the LRT company.
SELECT stops.name, a.company, a.num
FROM route a
INNER JOIN route b
ON a.company = b.company AND a.num = b.num
INNER JOIN stops
ON b.stop = stops.id
WHERE a.stop = 53 AND a.company = 'LRT';
-- 10. Yet to be solved
-- QUIZ
-- 1. Select the code that would show it is possible to get from Craiglockhart to Haymarket
SELECT DISTINCT a.name, b.name
FROM stops a
INNER JOIN route z
ON a.id = z.stop
INNER JOIN route y
ON y.num = z.num
INNER JOIN stops b
ON y.stop = b.id
WHERE a.name = 'Craiglockhart' AND b.name = 'Haymarket';
-- 2. Stops that are on route.num '2A' which can be reached with one bus from Haymarket
SELECT S2.id, S2.name, R2.company, R2.num
FROM stops S1, stops S2, route R1, route R2
WHERE S1.name = 'Haymarket' AND S1.id = R1.stop AND R1.company = R2.company AND R1.num = R2.num AND R2.stop=S2.id AND R2.num='2A';
-- 3. Services available from Tollcross
SELECT a.company, a.num, stopa.name, stopb.name
FROM route a
INNER JOIN route b
ON a.company = b.company AND a.num=b.num
INNER JOIN stops stopa
ON a.stop = stopa.id
INNER JOIN stops stopb
ON b.stop = stopb.id
WHERE stopa.name = 'Tollcross';