哪个更好:单个查询或先确定顺序,然后 select 带有 IN 列表的详细信息?
Which is better: a single query or first determine the order, then select details with an IN list?
我们有一个 Postgres 数据库,其中的表如下所示,其中 ITEM
表示类型,ordering/ranking:
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: 运行 首先查询获取类型 ordering/ranking 然后使用编程语言 (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%)
选项 1 总是更好。你的选项 2 是个坏习惯:
您必须 运行 三个 SQL 语句而不是一个
那些长的 IN
列表创建和处理起来很麻烦,它们会使 SQL 语句变得很长
此外,对第一个查询的结果进行排序没有意义,因为该排序将在其他查询中丢失,这需要另一个 ORDER BY
。最后,您必须合并两个有序列表。
我们有一个 Postgres 数据库,其中的表如下所示,其中 ITEM
表示类型,ordering/ranking:
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: 运行 首先查询获取类型 ordering/ranking 然后使用编程语言 (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%)
选项 1 总是更好。你的选项 2 是个坏习惯:
您必须 运行 三个 SQL 语句而不是一个
那些长的
IN
列表创建和处理起来很麻烦,它们会使 SQL 语句变得很长
此外,对第一个查询的结果进行排序没有意义,因为该排序将在其他查询中丢失,这需要另一个 ORDER BY
。最后,您必须合并两个有序列表。