TDQD の時間 — テスト駆動型クエリ設計
各ベンダーの請求書の最短日付は、次の式で与えられます。
SELECT vendor_id, MIN(invoice_date) AS invoice_date
FROM invoices
GROUP BY vendor_id
対応する最小請求書番号 (ベンダーが請求された最初の日に複数の請求書が送信された可能性がある場合、invoice_date
が時間コンポーネントのない真の DATE である場合; DATE に時間コンポーネントが含まれている場合、2 番目の MIN() はおそらく不要)、次のとおりです。
SELECT vendor_id, MIN(invoice_number) AS invoice_number
FROM invoices AS i
JOIN (SELECT vendor_id, MIN(invoice_date) AS invoice_date
FROM invoices
GROUP BY vendor_id
) AS j ON j.vendor_id = i.vendor_id AND j.invoice_date = i.invoice_date
GROUP BY vendor_id
クエリの要件に合わせて、この式を他のテーブルと結合できます。
SELECT v.*, i.*
FROM vendors AS v
JOIN (SELECT vendor_id, MIN(invoice_number) AS invoice_number
FROM invoices AS i
JOIN (SELECT vendor_id, MIN(invoice_date) AS invoice_date
FROM invoices
GROUP BY vendor_id
) AS j ON j.vendor_id = i.vendor_id AND j.invoice_date = i.invoice_date
GROUP BY vendor_id
) AS inv_info ON v.vendor_id = inv_info.vendor_id
JOIN invoices AS i ON i.invoice_number = inv_info.invoice_number
間違いなく、それを設計する他の方法があります。これらのサブクエリはいずれも相関サブクエリではないことに注意してください。
TDQD は純粋に名目上のものです。これらのクエリが構文的に有効であるかどうかをチェックするのに苦労した DBMS はありませんでした。OTOH、立ち技です。
GROUP BY 句に多数の列をリストするのが好きな場合は、サブクエリで関連する請求書の列を返すようにするinvoices
ことで、最後の結合を行わなくても済みます。inv_info
たくさんの列名を書き出すのは好きではありませんが、パフォーマンスが気になる場合は、それが有意な違いを生むかどうかを測定します。
記法上より速く仕事をする OLAP 関数/クエリがあることに気付くかもしれません。