首页 > 解决方案 > 从内部返回值存在没有连接的子查询

问题描述

我有以下查询

SELECT * FROM collection
WHERE id = 1 AND (
    privacy = 0
    OR (privacy = 1 AND
        EXISTS (SELECT * FROM collection_member WHERE collection_id = collection.id AND member_id = 1)
    )
)

这工作正常。但是我也想输出结果SELECT * FROM collection_member WHERE collection_id = collection.id AND member_id = 1在不使用连接的情况下实现这一目标的最有效方法是什么?(编辑:可能是子查询封装?)

标签: sqlpostgresql

解决方案


这是一个将子选择作为列放入的版本。

这仍然是一个连接,但也许它更接近你所追求的。

SELECT C.* , 
(SELECT MAX(M.MyColumn) 
 FROM collection_member M
 WHERE collection_id = C.id 
 AND M.member_id = 1
 ) MyColumn
FROM collection C
WHERE C.id = 1 
AND (
    C.privacy = 0
    OR (privacy = 1 AND
        EXISTS (
        SELECT * FROM collection_member CM
        WHERE CM.collection_id = C.id AND CM.member_id = 1)
    )
)

实际上,与执行 in the from 相比,这种方法的唯一好处JOIN是,它更容易确保您不会加入多对多和重复计算。

上面显示的查询MAX用于确保只返回一行。这可能是也可能不是您想要的行。


推荐阅读