7. 7
17.2.1 吭蹐坊瓦靴申Y惚 (3/5)
SELECT p.product_id,
COUNT(f.bug_id) AS count_fixed,
COUNT(o.bug_id) AS count_open
FROM BugsProducts p
INNER JOIN Bugs f ON p.bug_id = f.bug_id AND f.status = 'FIXED'
INNER JOIN BugsProducts p2 USING (product_id)
INNER JOIN Bugs o ON p2.bug_id = o.bug_id AND o.status = 'OPEN'
WHERE p.product_id = 1
GROUP BY p.product_id;
FROM BugsProducts p
INNER JOIN Bugs f ON p.bug_id = f.bug_id AND f.status = 'FIXED'
INNER JOIN Bugs o ON p2.bug_id = o.bug_id AND o.status = 'OPEN'
INNER JOIN BugsProducts p2
¢BugsProducts p
¢Bugs f
? bug_idでY栽
? statusが'FIXED'
¢BugsProducts p2
¢Bugs o
? bug_idでY栽
? statusが'OPEN'
* Spaghetti-Query/anti/cartesian.sql
FIXEDとOPEN
のバグのMみ栽
わせを崙泙垢
訳周なし。。。
13. 13
17.5 盾Q貨嵯峺扈y嵶を佩う
¢ sの圻tthe law of parsimony
?
まったく揖じ嚠yをする2つの栽する尖があるとき
は、gな圭がれている。
¢ この圻tをSQLに輝てはめると???
?
まったく揖じY惚セットを伏む2つのクエリをxkできる
栽は、gなクエリをxぶべき。
14. 14
17.5.1 ワンステップずつ (1/2)
SELECT p.product_id, COUNT(f.bug_id) AS count_fixed
FROM BugsProducts p
LEFT OUTER JOIN Bugs f ON p.bug_id = f.bug_id AND f.status = 'FIXED'
WHERE p.product_id = 1
GROUP BY p.product_id;
SELECT p2.product_id, COUNT(o.bug_id) AS count_open
FROM BugsProducts p2
LEFT OUTER JOIN Bugs o ON p2.bug_id = o.bug_id AND o.status = 'OPEN'
WHERE p2.product_id = 1
GROUP BY p2.product_id;
FROM BugsProducts p
INNER JOIN Bugs f ON p.bug_id = f.bug_id AND f.status = 'FIXED'
INNER JOIN Bugs o ON p2.bug_id = o.bug_id AND o.status = 'OPEN'
INNER JOIN BugsProducts p2
SELECT p.product_id,
COUNT(f.bug_id) AS count_fixed,
COUNT(o.bug_id) AS count_open
WHERE p.product_id = 1 GROUP BY p.product_id;
USING (product_id)
デカルトeを閲けるために、クエリを蛍護デカルトeを閲けるために、クエリを蛍護
Spaghetti-Query/anti/cartesian.sql
Spaghetti-Query/soln/split-query.sql
18. 18
17.5.4 貧望の}を盾Qする
恷念の盾Q貨は、貧望から箔められたタスクを蛍護してI尖すること。
*lかが函りQっているu瞳の方
SELECT COUNT(*) AS how_many_products FROM Products;
*バグを俐屎した_k宀の方
SELECT COUNT(DISTINCT assigned_to) AS how_many_developers
FROM Bugs WHERE status = 'FIXED';
*_k宀1繁あたりの峠譲バグ俐屎方
SELECT AVG(bugs_per_developer) AS average_bugs_per_developer
FROM (SELECT dev.account_id, COUNT(*) AS bugs_per_developer
FROM Bugs b INNER JOIN Accounts dev
ON b.assigned_to = dev.account_id
WHERE b.status = 'FIXED' GROUP BY dev.account_id) t;
*俐屎したバグの嶄で人から鷂罎気譴織丱阿諒
SELECT COUNT(*) AS how_many_customer_bugs
FROM Bugs b INNER JOIN Accounts cust ON b.reported_by = cust.account_id
WHERE b.status = 'FIXED' AND cust.email NOT LIKE '%@example.com';
19. 19
17.5.5 SQLを喘いたSQLの徭啜弔篇峰
* コラム此}}方のUPDATEステ`トメント伏撹
‐箭/ 双 last_used の、髻光コンピュ`タが聞喘された恷仟の晩原にO協する
SELECT CONCAT('UPDATE Inventory '
' SET last_used = ''', MAX(u.usage_date), '''',
' WHERE inventory_id = ', u.inventory_id, ';') AS update_statement
FROM ComputerUsage u
GROUP BY u.inventory_id;
¢ }jなSQLクエリを蛍護すると、デ`タの、砲茲
てわずかになる、貌たようなクエリをいくつも伏
撹することがある。
? それはわしいので、仝コ`ド伏撹々を佩いましょう。
? 仝コ`ド伏撹々は、仟しいコ`ドを返でくには掲械に
薦がかかるような中で森議。