Ray Voelker
ray.voelker@cincinnatilibrary.org
...and Rufus and Audrey
Keys (typically called ID’s in the Sierra Database) come in two varieties, and they define the relationship between tables.
Relational Databases: Relationships (JOINS)
Relational Databases: Relationships (JOINS) cont.
Relational Databases: Relationships (JOINS) cont.
SQL Overview cont.
SQL Overview cont.
SQL Overview cont.
SQL Overview cont.
SQL Overview cont.
SQL Overview cont.
SELECT
r.id, r.record_type_code,
r.record_num, r.creation_date_gmt,
r.deletion_date_gmt, r.num_revisions
FROM
sierra_view.record_metadata AS r
WHERE
r.record_type_code = 'b'
ORDER BY
r.creation_date_gmt ASC
Filter by specific bib numbers ...
SELECT
r.id, r.record_type_code,
r.record_num, r.creation_date_gmt,
r.deletion_date_gmt, r.num_revisions
FROM
record_metadata AS r
WHERE
r.record_type_code = 'b'
AND r.record_num IN (
1000001, 1000032, 1000041, 1000045, 1000056,
1000139, 1000303, 1000345, 1000410, 1000426
)
ORDER BY
r.creation_date_gmt ASC
SQL SELECT Statement cont.
JOIN table bib_record_property ...
SELECT
r.id, r.record_type_code,
r.record_num, r.creation_date_gmt,
r.deletion_date_gmt, r.num_revisions,
p.best_title
FROM
record_metadata AS r
JOIN bib_record_property AS p
ON p.bib_record_id = r.id
WHERE
r.record_type_code = 'b'
AND r.record_num IN (
1000001, 1000032, 1000041, 1000045, 1000056,
1000139, 1000303, 1000345, 1000410, 1000426
)
ORDER BY
r.creation_date_gmt ASC
SQL SELECT Statement cont.
JOIN LEFT OUTER JOIN table bib_record_property ...
SELECT
r.id, r.record_type_code,
r.record_num, r.creation_date_gmt,
r.deletion_date_gmt, r.num_revisions,
p.best_title
FROM
record_metadata AS r
-- JOIN bib_record_property as p
LEFT OUTER JOIN bib_record_property as p
ON p.bib_record_id = r.id
WHERE
r.record_type_code = 'b'
AND r.record_num IN (
1000001, 1000032, 1000041, 1000045, 1000056,
1000139, 1000303, 1000345, 1000410, 1000426
)
ORDER BY
r.creation_date_gmt ASC
SQL GROUP BY / HAVING and Aggregate Functions cont.
SQL GROUP BY / HAVING and Aggregate Functions cont.
SELECT
p.publish_year,
count(*) as count
FROM
bib_record_property as p
WHERE
p.publish_year = 1977
GROUP BY
p.publish_year
SQL GROUP BY / HAVING and Aggregate Functions cont.
SQL GROUP BY / HAVING and Aggregate Functions cont.
SELECT
p.publish_year,
count(*) as count
FROM
bib_record_property as p
GROUP BY
p.publish_year
HAVING
count(*) = 200
SQL GROUP BY / HAVING and Aggregate Functions cont.
SQL GROUP BY / HAVING and Aggregate Functions cont.
SELECT
p.best_title,
r.record_num AS bib_record_num,
sum( i.checkout_total + i.renewal_total) AS total_circ
FROM
item_record AS i
JOIN
bib_record_item_record_link as l
ON l.item_record_id = i.record_id
JOIN
bib_record_property AS p
ON p.bib_record_id = l.bib_record_id
JOIN
record_metadata AS r
ON r.id = l.bib_record_id
WHERE
-- baadc : 'Blue Ash Documentaries'
i.location_code = 'baadc'
GROUP BY
best_title,
bib_record_num
ORDER BY
total_circ DESC
LIMIT 5
Subquery
Subquery cont.
Subquery cont.
SELECT
ir.record_id
FROM
item_record as ir
JOIN varfield AS vf
ON vf.record_id = ir.record_id
AND vf.varfield_type_code = 'b'
GROUP BY
ir.record_id
HAVING
count(*) > 1
Subquery cont.
SELECT
i.record_id as item_record_id,
r.record_num as item_record_num,
i.location_code,
v.field_content,
v.occ_num
FROM
item_record as i
JOIN
record_metadata as r
ON r.id = i.record_id
JOIN varfield AS v
ON v.record_id = i.record_id
AND v.varfield_type_code = 'b'
WHERE
i.record_id IN (
SELECT
ir.record_id
FROM
item_record as ir
JOIN varfield AS vf
ON vf.record_id = ir.record_id
AND vf.varfield_type_code = 'b'
GROUP BY
ir.record_id
HAVING
count(*) > 1
)
ORDER BY
i.record_id,
v.occ_num
Subquery cont.
SELECT
i.record_id,
i.item_status_code,
i.location_code,
v.field_content
FROM
item_record AS i
JOIN
varfield AS v
ON v.record_id = i.record_id
AND v.varfield_type_code = 'b'
-- say we were targeting these two item records.
-- we may only expect two rows in our results ...
WHERE
i.record_id IN (
450977833432, 450978609205
)
Subquery cont.
SELECT
i.record_id,
i.item_status_code,
i.location_code,
(
SELECT
v.field_content
FROM
varfield as v
WHERE
v.record_id = i.record_id
AND v.varfield_type_code = 'b'
ORDER BY
v.occ_num
LIMIT 1
) AS barcode
FROM
item_record AS i
WHERE
i.record_id IN (
450977833432, 450978609205
)
CASE Statement
CASE Statement cont.
CASE Statement cont.
SELECT
r.record_num AS item_record_num, i.item_status_code,
CASE
WHEN item_status_code = '-' THEN 'AVAILABLE'
WHEN item_status_code = 'o' THEN 'LIB USE ONLY'
ELSE item_status_code
END as our_item_status
FROM
item_record as i
JOIN
record_metadata as r
ON r.id = i.record_id
ORDER BY
r.creation_date_gmt ASC
LIMIT 10
CASE Statement cont.
CASE Statement cont.
SELECT
r.record_num as item_record_num,
i.last_checkout_gmt,
CASE
WHEN i.last_checkout_gmt >= '2020-01-01' THEN '1-recent checkouts'
WHEN i.last_checkout_gmt >= '2018-01-01' THEN '2-kinda-recent checkouts'
WHEN i.last_checkout_gmt < '2018-01-01' THEN '3-long-ago checkouts'
WHEN i.last_checkout_gmt is null THEN '4-NO CHECKOUTS!'
END as 'last_checkout_groups'
FROM
item_record as i
JOIN
record_metadata as r
ON
r.id = i.record_id
WHERE
i.location_code = '1cj'
LIMIT 10
CASE Statement cont.
SELECT
CASE
WHEN i.last_checkout_gmt >= '2020-01-01' THEN '1-recent checkouts'
WHEN i.last_checkout_gmt >= '2018-01-01' THEN '2-kinda-recent checkouts'
WHEN i.last_checkout_gmt < '2018-01-01' THEN '3-long-ago checkouts'
WHEN i.last_checkout_gmt is null THEN '4-NO CHECKOUTS!'
END as 'last_checkout_groups',
count(*) as count_items
FROM
item_record as i
WHERE
i.location_code = '1cj'
GROUP BY
last_checkout_groups
ORDER BY
last_checkout_groups
Other Useful Resources