runtime
26 / 88

lesson 26 Joins & sets · advanced

Combine sets with UNION

Combine query results with or without duplicates.

the idea

UNION stacks the rows of two queries with the same number of columns and removes duplicates. UNION ALL keeps every row, which is what you need when each row is an event to be counted.

Dataset: Developer Platform

The tables the challenges use, with their first 6 rows. Under each column name: the kind of value it holds, and which table it links to.

pull_requests10 columns · 13,242 rows
pull_request_idnumber · unique idrepository_idnumber · links to repositoriesauthor_idnumber · links to developerstitletextcreated_atdate & timemerged_atdate & timeclosed_atdate & timestatetextadditionsnumberdeletionsnumber
1124Fix rate limiter2024-01-27 05:50:25NULL2024-02-16 05:29:35closed4710
2158Fix dashboard query2024-02-10 17:45:142024-02-11 12:07:272024-02-11 12:07:27merged165
319Fix cache invalidation2024-02-12 12:03:262024-02-12 18:28:292024-02-12 18:28:29merged763365
4124Migrate retry logic2024-02-14 09:27:382024-02-16 01:04:572024-02-16 01:04:57merged16153
519Remove login flow2024-03-10 14:32:052024-03-11 04:00:502024-03-11 04:00:50merged396129
6158Migrate cache invalidation2024-03-12 10:11:262024-03-12 17:06:252024-03-12 17:06:25merged7151
pull_request_idnumber · unique id
1
repository_idnumber · links to repositories
1
author_idnumber · links to developers
24
titletext
Fix rate limiter
created_atdate & time
2024-01-27 05:50:25
merged_atdate & time
NULL
closed_atdate & time
2024-02-16 05:29:35
statetext
closed
additionsnumber
47
deletionsnumber
10
pull_request_idnumber · unique id
2
repository_idnumber · links to repositories
1
author_idnumber · links to developers
58
titletext
Fix dashboard query
created_atdate & time
2024-02-10 17:45:14
merged_atdate & time
2024-02-11 12:07:27
closed_atdate & time
2024-02-11 12:07:27
statetext
merged
additionsnumber
16
deletionsnumber
5
pull_request_idnumber · unique id
3
repository_idnumber · links to repositories
1
author_idnumber · links to developers
9
titletext
Fix cache invalidation
created_atdate & time
2024-02-12 12:03:26
merged_atdate & time
2024-02-12 18:28:29
closed_atdate & time
2024-02-12 18:28:29
statetext
merged
additionsnumber
763
deletionsnumber
365
pull_request_idnumber · unique id
4
repository_idnumber · links to repositories
1
author_idnumber · links to developers
24
titletext
Migrate retry logic
created_atdate & time
2024-02-14 09:27:38
merged_atdate & time
2024-02-16 01:04:57
closed_atdate & time
2024-02-16 01:04:57
statetext
merged
additionsnumber
161
deletionsnumber
53
pull_request_idnumber · unique id
5
repository_idnumber · links to repositories
1
author_idnumber · links to developers
9
titletext
Remove login flow
created_atdate & time
2024-03-10 14:32:05
merged_atdate & time
2024-03-11 04:00:50
closed_atdate & time
2024-03-11 04:00:50
statetext
merged
additionsnumber
396
deletionsnumber
129
pull_request_idnumber · unique id
6
repository_idnumber · links to repositories
1
author_idnumber · links to developers
58
titletext
Migrate cache invalidation
created_atdate & time
2024-03-12 10:11:26
merged_atdate & time
2024-03-12 17:06:25
closed_atdate & time
2024-03-12 17:06:25
statetext
merged
additionsnumber
71
deletionsnumber
51

first 6 of 13,242 rows · your queries use all of them

reviews5 columns · 19,622 rows
review_idnumber · unique idpull_request_idnumber · links to pull_requestsreviewer_idnumber · links to developerssubmitted_atdate & timestatetext
1877519862024-01-01 04:49:28approved
210172452024-01-01 04:49:34commented
31058623402024-01-01 06:55:14commented
41130825512024-01-01 07:54:01changes_requested
5977722042024-01-01 12:48:19approved
6827792024-01-01 16:04:29approved
review_idnumber · unique id
1
pull_request_idnumber · links to pull_requests
8775
reviewer_idnumber · links to developers
1986
submitted_atdate & time
2024-01-01 04:49:28
statetext
approved
review_idnumber · unique id
2
pull_request_idnumber · links to pull_requests
1017
reviewer_idnumber · links to developers
245
submitted_atdate & time
2024-01-01 04:49:34
statetext
commented
review_idnumber · unique id
3
pull_request_idnumber · links to pull_requests
10586
reviewer_idnumber · links to developers
2340
submitted_atdate & time
2024-01-01 06:55:14
statetext
commented
review_idnumber · unique id
4
pull_request_idnumber · links to pull_requests
11308
reviewer_idnumber · links to developers
2551
submitted_atdate & time
2024-01-01 07:54:01
statetext
changes_requested
review_idnumber · unique id
5
pull_request_idnumber · links to pull_requests
9777
reviewer_idnumber · links to developers
2204
submitted_atdate & time
2024-01-01 12:48:19
statetext
approved
review_idnumber · unique id
6
pull_request_idnumber · links to pull_requests
827
reviewer_idnumber · links to developers
79
submitted_atdate & time
2024-01-01 16:04:29
statetext
approved

first 6 of 19,622 rows · your queries use all of them

developers9 columns · 2,891 rows
developer_idnumber · unique idorganization_idnumber · links to organizationsteam_idnumber · links to teamsusernametextdisplay_nametextroletextmanager_idnumber · links to developersjoined_atdate & timeleft_attext
11NULLzgreen1Zara GreenvpNULL2022-06-03 00:00:00NULL
211dturner2Daniela Turnerdirector12022-07-03 00:00:00NULL
312cthomas3Carlos Thomasdirector12022-11-30 00:00:00NULL
413mkang4Miguel Kangdirector12022-09-29 00:00:00NULL
514rnguyen5Ryan Nguyenmanager22023-07-27 00:00:00NULL
615jabbott6Jose Abbottmanager22022-10-15 00:00:00NULL
developer_idnumber · unique id
1
organization_idnumber · links to organizations
1
team_idnumber · links to teams
NULL
usernametext
zgreen1
display_nametext
Zara Green
roletext
vp
manager_idnumber · links to developers
NULL
joined_atdate & time
2022-06-03 00:00:00
left_attext
NULL
developer_idnumber · unique id
2
organization_idnumber · links to organizations
1
team_idnumber · links to teams
1
usernametext
dturner2
display_nametext
Daniela Turner
roletext
director
manager_idnumber · links to developers
1
joined_atdate & time
2022-07-03 00:00:00
left_attext
NULL
developer_idnumber · unique id
3
organization_idnumber · links to organizations
1
team_idnumber · links to teams
2
usernametext
cthomas3
display_nametext
Carlos Thomas
roletext
director
manager_idnumber · links to developers
1
joined_atdate & time
2022-11-30 00:00:00
left_attext
NULL
developer_idnumber · unique id
4
organization_idnumber · links to organizations
1
team_idnumber · links to teams
3
usernametext
mkang4
display_nametext
Miguel Kang
roletext
director
manager_idnumber · links to developers
1
joined_atdate & time
2022-09-29 00:00:00
left_attext
NULL
developer_idnumber · unique id
5
organization_idnumber · links to organizations
1
team_idnumber · links to teams
4
usernametext
rnguyen5
display_nametext
Ryan Nguyen
roletext
manager
manager_idnumber · links to developers
2
joined_atdate & time
2023-07-27 00:00:00
left_attext
NULL
developer_idnumber · unique id
6
organization_idnumber · links to organizations
1
team_idnumber · links to teams
5
usernametext
jabbott6
display_nametext
Jose Abbott
roletext
manager
manager_idnumber · links to developers
2
joined_atdate & time
2022-10-15 00:00:00
left_attext
NULL

first 6 of 2,891 rows · your queries use all of them

worked example

Run these steps in order to see the idea before you write your own query. The step marked “the pattern” is what the challenges ask for. Running the example does not count toward progress.

  1. Stack two role lists with UNION. Run this. UNION combines author and reviewer rows and removes duplicate developer ids.the pattern

    example.sql
    SELECT author_id AS developer_id, 'author' AS role
    FROM pull_requests
    WHERE repository_id = 1
    UNION
    SELECT reviewer_id, 'reviewer'
    FROM reviews
    JOIN pull_requests USING (pull_request_id)
    WHERE repository_id = 1;
  2. See UNION versus UNION ALL counts. Run this. UNION ALL keeps every row; UNION drops duplicates so totals differ.

    step-2.sql
    SELECT
      (
        SELECT COUNT(*)
        FROM (
          SELECT author_id
          FROM pull_requests
          UNION
          SELECT reviewer_id
          FROM reviews
        )
      ) AS union_rows,
      (
        SELECT COUNT(*)
        FROM (
          SELECT author_id
          FROM pull_requests
          UNION ALL
          SELECT reviewer_id
          FROM reviews
        )
      ) AS union_all_rows;

common mistake

UNION removes duplicate rows, so counting contributions after UNION undercounts anyone with two identical rows.

challenge 1

Return developer_id for every developer who authored a pull request or submitted a review, once each.

what to return

Columns
developer_id
Rows
any order
challenge-1.sql
 
To master this lesson, solve both challenges without hints and pass the concept check. 3 of 3 to go.
Combine sets with UNION — Joins & sets · Runtime