为什么WHERE条件会丢弃LEFT JOIN获得的内容? SQLITE

问题描述 投票:0回答:2

[3个相关表的示例:enter image description here

  • 用户2(Marie)未在“关系”表中注册。因此,以后使用SELECT时,其关系值必须为null /空。

我进行以下选择,以获取(感兴趣的)所有我感兴趣的相关数据:

SELECT id, action, actions.uid, name, relation
FROM actions
LEFT JOIN (SELECT * FROM relations GROUP BY uid) USING (uid)
INNER JOIN users USING (uid)
GROUP BY actions.id;

然后返回:enter image description here

当我需要使用条件根据关系类型“删除”结果时,会发生问题。

我进行以下查询以丢弃先前结果中的“朋友”(关系):

SELECT id, action, actions.uid, name, relation
FROM actions
LEFT JOIN (SELECT * FROM relations GROUP BY uid) USING (uid)
INNER JOIN users USING (uid)
WHERE relation != 'friend'
GROUP BY actions.id;

但是它应该返回一个结果(玛丽),并且它返回0个结果...

我不喜欢由于'... WHERE关系IS NULL'之类的类型条件而获得Marie,我的查询应该属于废弃过滤器,因为它们属于过滤工具。

enter image description here

sql sqlite subquery left-join inner-join
2个回答
0
投票

[尝试使用Coalesce(Relation,'')!='friend'。希望它起作用


0
投票

您需要使用on子句进行过滤:

SELECT id, action, actions.uid, name, relation
FROM actions LEFT JOIN 
     relations 
     USING (uid) AND relation != 'friend' LEFT JOIN -- Don't mix the left & inner join
     users USING (uid); 

LEFT JOINWHERE子句将变为INNER JOIN,与null进行比较将始终为false。因此,在加入时分开过滤。

但是,我将其重新表达为:

SELECT a.id, a.action, a.uid, u.name, r.relation
FROM actions a INNER JOIN
     users u
     USING (uid) LEFT JOIN
     relation r
     USING (uid) AND r.relation != 'friend';
© www.soinside.com 2019 - 2024. All rights reserved.