View on GitHub

Today I Learned

Software Engineering Blog

9 Self join

1.

SELECT
  COUNT(*)  
FROM
  stops

2.

SELECT
  id
FROM
  stops
WHERE
  name = 'Craiglockhart'

3.

SELECT
  id,
  name
FROM
  stops
  JOIN route ON stop = stops.id
WHERE
  num = 4
  AND company = 'LRT'

4.

SELECT
  company,
  num,
  COUNT(*)
FROM
  route
WHERE
  stop=149 OR stop=53
GROUP BY
  company,
  num
HAVING
  COUNT(*) >= 2

5.

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
  AND b.stop = (SELECT id FROM stops WHERE name = 'London Road')

6.

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.

SELECT
  a.company,
  a.num
FROM
  route a,
  route b
WHERE
  (a.stop = 115 AND b.stop = 137)
  AND a.num = b.num
GROUP BY
  a.company, a.num

8.

SELECT
  a.company,
  a.num
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 = 'Tollcross'

9.

SELECT DISTINCT
  name,
  a.company,
  a.num
FROM
  route a
  JOIN route b ON (a.company = b.company AND a.num = b.num)
  JOIN stops ON a.stop = stops.id
WHERE
  b.stop = (
    SELECT
      id
    FROM
      stops
    WHERE
      name = 'Craiglockhart'
  )

10.

SELECT
  a.num,
  a.company,
  stopb.name,
  c.num,
  c.company
FROM
  route a
  JOIN route b ON (a.company = b.company AND a.num = b.num)
  JOIN (
    route c
    JOIN route d ON (c.company = d.company AND c.num = d.num)
  )
  JOIN stops stopa ON a.stop = stopa.id
  JOIN stops stopb ON b.stop = stopb.id
  JOIN stops stopc ON c.stop = stopc.id
  JOIN stops stopd ON d.stop = stopd.id
WHERE
  stopa.name = 'Craiglockhart'
  AND stopd.name = 'Lochend'
  AND stopb.name = stopc.name
ORDER BY
  LENGTH(a.num),
  b.num,
  stopb.name,
  LENGTH(c.num),
  d.num