1 回答

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超10個(gè)贊
問(wèn)題是您期望返回多少個(gè)值。PostgreSQL 對(duì)生成的數(shù)據(jù)不是很好,就像這個(gè)解決方案使用的那樣,所以如果它太慢,只獲取所有組合的列表并使用 Python 查找不存在的組合可能會(huì)更快。
另外,我在這里根據(jù)您的查詢假設(shè)每個(gè) listing_id/key 對(duì)有一行,并且您沒(méi)有將鍵存儲(chǔ)為字符串?dāng)?shù)組。如果是這樣,請(qǐng)告訴我,我會(huì)修改答案。
首先,我假設(shè)您不想要沒(méi)有匹配項(xiàng)的 ID,因此您可以像這樣構(gòu)造它而不是生成列表。我使用 來(lái)func.count()過(guò)濾掉所有與所有鍵匹配的列表:
unique_incomplete_listings = session.query(Table.listing_id.label('listing_id'))
.group_by(Table.listing_id)
.having(func.count() < 3)
其次,將其轉(zhuǎn)換為CTE,然后從查詢中獲取 (listing, key) 的所有可能組合:
from sqlalchemy.dialects.postgresql import array
unique_incomplete_listings = unique_incomplete_listings.cte()
all_potential_matches = session.query(
unique_incomplete_listings.c.listing_id,
# this creates a cartesian product of listing_ids to elements in the array
func.unnest(array(['key1', 'key2', 'key3']))
)
使用EXCEPT刪除您在數(shù)據(jù)庫(kù)中找到的任何匹配項(xiàng)
query = all_potential_matches.except_all(
session.query(Table.listing_id, Table.key)
# We join here to prevent doing extra work if the listing does have all keys.
# If this makes the query slower, consider making the CTE a subquery and
# removing this join instead
.join(unique_incomplete_listings,
unique_incomplete_listings.c.listing_id == Table.listing_id)
)
添加回答
舉報(bào)