Sql 从内部返回值的子查询不存在联接

Sql 从内部返回值的子查询不存在联接,sql,postgresql,Sql,Postgresql,我有以下疑问 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) ) ) 这很好用。但是,我还想从选择*fromcollection\u成员输出结果,其中collect

我有以下疑问

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)
    )
)

这很好用。但是,我还想从
选择*fromcollection\u成员输出结果,其中collection\u id=collection.id和member\u id=1
。在不使用联接的情况下,实现这一点的最有效方法是什么?(编辑:可能?

您无法“从
存在的子查询中获取值”

你必须加入它:

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

当然,与您的查询不同,
collection
行将针对
collection\u成员中的每个匹配行显示一次。您可以通过聚合所有
collection\u成员的值来处理此问题。

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

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

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)
    )
)
实际上,与在from中执行
JOIN
相比,这种方法的唯一好处是,可以更轻松地确保您没有加入多对多和重复计算

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

试试这个

SELECT c.*, cm.*
FROM collection c
        Left Join collection_member cm on (cm.collection_id = c.collection.id and cm.member_id = 1)
WHERE case
        when c.privacy = 0 Then 1
        when c.privacy = 1 and cm.collection_id is not null Then 1
        else 0
      end = 1
and c.id = 1 

如果要从集合成员获取信息,必须使用联接。为什么你不想这样做呢?@a_horse_,没有名字,因为这只是一个更大查询的简化版本,它使用连接来获取其他数据。所以我想知道是否还有其他方法。集合中可能有许多匹配的成员。表名显然暗示了这一点。你想要哪一个?不使用联接有什么理由?@Nick.McDermaid实际上由于
和member_id=1
,它应该只匹配一个成员。基本上,您需要使用联接从该表返回数据,无论是在from子句还是select子句中。或者,如果确实不想使用连接,可以使用光标。那太疯狂了。我想这是唯一的办法。需要注意的是,第一个子查询只能返回一列,对吗?是,只能返回一列,也只能返回一行。如果需要返回多个列,则需要在
FROM
子句中正确联接表。无论如何,这两种方法都需要连接。没有解释为什么你不想加入。正如我提到的,唯一的非连接选项是游标,这完全是错误的。这个问题真正令人费解的部分是“不使用连接”的约束。为什么不希望在数据库中使用联接?这就是它的力量。子查询并不是避免联接的一种方法-您仍然需要联接子查询,在某些情况下,使用子查询会妨碍qurey planner并影响性能。