--- id: 2026-03-31T07:43:16-0400 title: 2026-03-31 07:43:16 tags: - status/draft date-created: 2026-03-31T07:43:16-04:00 daily: "[[2026-03-31]]" --- # 2026-03-31 07:43:16 ## SQL Patterns to Implement ### Cross Join In [[sql]], the `CROSS JOIN` operation returns the [cartesian product](https://en.wikipedia.org/wiki/Cartesian_product) of two tables. ```sqlite CREATE TABLE WireSizes (wire_size TEXT NOT NULL); INSERT INTO WireSizes VALUES ('#12'), ('#10'), ('#8'), ('#6'), ('#4'), ('#2'), ('#1'), ('#1/0'), ('#2/0'); CREATE TABLE WireMaterials (wire_material TEXT NOT NULL); INSERT INTO WireMaterials VALUES ('CU'), ('AL'); SELECT wire_size, wire_material FROM WireSizes CROSS JOIN WireMaterials; ``` ```sqlite SELECT wire_size||' '||wire_material AS wire_type FROM WireSizes, WireMaterials; -- implicit cross join ``` ### Create Table From Query `CREATE TABLE _ AS` syntax is intuitive, ```sqlite CREATE TABLE Wires AS SELECT wire_size, wire_material FROM WireSizes, WireMaterials; ``` but it excludes the ability to set constraints. Use this pattern instead: ```sqlite CREATE TABLE Wires ( wire_size TEXT NOT NULL, wire_material TEXT NOT NULL, PRIMARY KEY (wire_size, wire_material), FOREIGN KEY (wire_size) REFERENCES WireSizes(wire_size), FOREIGN KEY (wire_material) REFERENCES WireMaterials(wire_material) ); INSERT INTO Wires (wire_size, wire_material) SELECT wire_size, wire_material FROM WireSizes, WireMaterials; ``` You'd think you could just throw an `AS` after the constraints and omit the `INSERT` statement, but no. ### Add Columns to Table for adding data after creating new tables with [[#Cross Join]] ```sqlite ALTER TABLE Wires ADD length_specific_dc_resistance_in_milliohms_per_foot FLOAT; UPDATE Wires SET length_specific_dc_resistance_in_milliohms_per_foot = CASE WHEN wire_size = '#8' AND wire_material = 'CU' THEN 0.778 WHEN wire_size = '#6' AND wire_material = 'CU' THEN 0.491 WHEN wire_size = '#4' AND wire_material = 'CU' THEN 0.308 -- ... ELSE NULL END; ``` ### Resources * [sqlshack.com](https://www.sqlshack.com/)