我有一個如下的選擇陳述句:
我有一個如下的選擇陳述句。
SELECT。
卡片。*。
COUNT(card.*) OVER() as full_count。
p.printing_information
FROM[/span
卡片
LEFT JOIN
(SELECT SELECT
pr.card_id, jsonb_agg(to_jsonb(pr)) AS printing_information
FROM[/span
印刷品pr
GROUP BY PR.card_id
pr.card_id) p ON cards.card_id = p.card_id
WHERE
...
我希望能夠查詢set_id,它在printings表中。我試圖通過包括pr.set_id在我的上述選擇陳述句中做到這一點,但是它需要一個GROUP BY pr.card_id, pr.set_id,然后在每個列印中產生一行,而不是在printing_information子陣列中的所有列印。
除非我能夠確定如何做到這一點,否則是否有可能在jsonb的printing_information陣列中搜索?
事實上,我想做的是:
WHERE p. printing_information->set_id = '123'/span>
不幸的是,我不能這樣做,因為它是在一個陣列中。
什么是實作這一目標的最佳方法?我可以只對結果進行后處理,以剝離不必要的結果,但我覺得一定有更好的方法。
uj5u.com熱心網友回復:
SELECT cards.*
, count(card.*) over() as full_count
, p.printing_information
FROM卡片
LEFT JOIN (
SELECT pr.card_id, jsonb_agg(to_jsonb(pr) ) AS printing_information
FROM printings pr
WHERE pr.set_id = '123' --here!
GROUP BY pr.card_id
) p ON cards.card_id = p.card_id
WHERE ...。
這比事后過濾便宜得多。并且可以通過(set_id)上的索引來支持 - 與任何試圖在動態生成的jsonb列上進行過濾的做法不同。
這很有效,而我們無論如何都需要從表printings中聚合所有或大多數行。但是你添加的WHERE ...意味著在外SELECT上有更多的過濾器。如果這樣做的結果是只需要從printings中提取幾條記錄,那么一個LATERAL子查詢應該更有效率:
SELECT cards.*
, count(card.*) OVER() as full_count
, p.printing_information
FROM cards c
CROSS JOIN LATERAL (
SELECT jsonb_agg(to_jsonb(pr) ) AS printing_information
FROM printings pr
WHERE pr.card_id = c.card_id
AND pr.set_id = '123' --此處!
) p
WHERE ... --這里有選擇性的過濾?!?/span>
見:
另外,這里沒有 "jsonb的陣列"。子查詢產生一個包含陣列的jsonb。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/322798.html
標籤:
