我們有一個帶有表的 Postgres 資料庫,如下所示,其中ITEM告訴型別和排序/排名:
ITEM (id, itemId, type, ranking)
TEXTBOOK (id, title, total_pages)
TEXTBOOK_DATA (id, price, availability, supplier)
MAGAZINE (id, title, edition)
MAGAZINE_DATA (id, price, supplier)
當我們在 UI 上顯示時,我們需要顯示如下串列:
- TxtbookTitle1,total_pages,價格,可用性,供應商
- MagazineTitle1、版本、價格、供應商
- TxtbookTitle2,total_pages,價格,可用性,供應商
- MagazineTitle2、版本、價格、供應商
將有很多記錄要過濾,因此我們正在考慮 Option1 是否比 Option2 更好(即更快,計算密集度更低),或者是否有另一個更好的 Option 而無需從根本上改變表格。幫助表示贊賞。謝謝。
選項 #1:左連接表,然后通過 Where 子句進行過濾
SELECT
Item.id,
COALESCE(Txtbook.title, Magazine.title) "title",
COALESCE(TxtbookData.price, MagazineData.price) "price",
COALESCE(TxtbookData.supplier, MagazineData.supplier) "supplier",
Txtbook.total_pages, Magazine.edition, TxtbookData.availability
FROM
ITEM Item
LEFT JOIN
TEXTBOOK Txtbook ON Item.id = Txtbook.id -- TextBook
LEFT JOIN
TEXTBOOK_DATA TxtbookData ON Item.id = TxtbookData.id
LEFT JOIN
MAGAZINE Magazine ON Item.id = Magazine.id -- Magazine
LEFT JOIN
MAGAZINE_DATA MagazineData ON Item.id = MagazineData.id
WHERE
Item.itemId IN (1, 2, 3, 4)
ORDER BY
Item.ranking
選項 #2:運行第一個查詢以獲取型別和排序/排名,然后使用編程語言 (Java/Javascript/C#) 過濾 Id。然后為每種型別運行單獨的查詢
SELECT Item.id, Item.type
FROM ITEM Item
WHERE Item.itemId in (1, 2, 3, 4)
ORDER BY Item.ranking
SELECT Txtbook.id, Txtbook.title, TxtbookData.price, TxtbookData.supplier, Txtbook.total_pages, Magazine.edition, TxtbookData.availability
FROM TEXTBOOK Txtbook
INNER JOIN TEXTBOOK_DATA TxtbookData on Txtbook.id = TxtbookData.id
WHERE Txtbook.id in (%filteredIds%)
SELECT Magazine.id, Magazine.title, MagazineData.price, MagazineData.supplier, Magazine.edition
FROM MAGAZINE Magazine
INNER JOIN MAGAZINE_DATA MagazineData on Magazine.id = MagazineData.id
WHERE Magazine.id in (%filteredIds%)
uj5u.com熱心網友回復:
選項 1 總是更好。您的選項 2 是一個壞習慣:
您必須運行三個 SQL 陳述句而不是一個
那些長
IN串列創建和處理起來很麻煩,而且它們會使 SQL 陳述句變得很長
此外,對第一個查詢的結果進行排序是沒有意義的,因為該排序將在其他查詢中丟失,這需要另一個ORDER BY. 最后,您必須合并兩個有序串列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/326932.html
標籤:sql PostgreSQL 查询优化
下一篇:使用條件時的語法錯誤
