-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path2.4.sql
More file actions
103 lines (96 loc) · 2.09 KB
/
2.4.sql
File metadata and controls
103 lines (96 loc) · 2.09 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
-- In case you forgot to cleanup the previous demos...
DELETE FROM Adoptions WHERE Name = 'Duplicate';
DELETE FROM Animals WHERE Name IN ('Duplicate', 'Ferris');
-- 1. Start with a simple CROSS JOIN
SELECT *
FROM Animals AS A1
CROSS JOIN
Animals AS A2;
-- 2. Filter for same species and breed
SELECT *
FROM Animals AS A1
INNER JOIN
Animals AS A2
ON A1.Species = A2.Species
AND
A1.Breed = A2.Breed;
-- 3. Replace * with required column names
SELECT A1.Species,
A1.Breed AS Breed,
A1.Name AS Male,
A2.Name AS Female
FROM Animals AS A1
INNER JOIN
Animals AS A2
ON A1.Species = A2.Species
AND
A1.Breed = A2.Breed
ORDER BY A1.Species,
A1.Breed;
-- 4. Add predicate or comment for future developers
SELECT A1.Species,
A1.Breed AS Breed,
A1.Name AS Male,
A2.Name AS Female
FROM Animals AS A1
INNER JOIN
Animals AS A2
ON A1.Species = A2.Species
AND
A1.Breed = A2.Breed -- Removes NULL breeds
-- AND
-- A1.Breed IS NOT NULL --
ORDER BY A1.Species,
A1.Breed;
-- 5. Don't match animals with themselves.
SELECT A1.Species,
A1.Breed AS Breed,
A1.Name AS Male,
A2.Name AS Female
FROM Animals AS A1
INNER JOIN
Animals AS A2
ON A1.Species = A2.Species
AND
A1.Breed = A2.Breed -- Removes NULL breeds
AND
A1.Name <> A2.Name
ORDER BY A1.Species,
A1.Breed;
-- 6. Solution
SELECT A1.Species,
A1.Breed AS Breed,
A1.Name AS Male,
A2.Name AS Female
FROM Animals AS A1
INNER JOIN
Animals AS A2
ON A1.Species = A2.Species
AND
A1.Breed = A2.Breed -- Removes NULL breeds
AND
A1.Name <> A2.Name
AND
A1.Gender = 'M'
AND
A2.Gender = 'F'
ORDER BY A1.Species,
A1.Breed;
-- 7. Solution with > shortcut
-- !!! Only works if collation is dictionary based, and if case insensitive or casing is consistent !!!
SELECT A1.Species,
A1.Breed AS Breed,
A1.Name AS Male,
A2.Name AS Female
FROM Animals AS A1
INNER JOIN
Animals AS A2
ON A1.Species = A2.Species
AND
A1.Breed = A2.Breed -- Removes NULL breeds
AND
A1.Name <> A2.Name
AND
A1.Gender > A2.Gender
ORDER BY A1.Species,
A1.Breed;