LEFT加入和右表中的数据

时间:2018-04-05 08:06:14

标签: sql postgresql left-join

我的sql join请求有问题,我需要获取左表的行,这些行未在右表中引用或在右表中引用,状态等于0表示我的用户1。 我还需要右表的字段状态 这是我的两张桌子:

Table left
ID | title
1  | Title 1
2  | Title 2
3  | Title 3
4  | Title 4
5  | Title 5

Table right
ID | status | user | left_id
1  |    0   |   1  |    1
2  |    0   |   50 |    1
3  |    1   |   1  |    2
4  |    0   |   50 |    2
5  |    0   |   1  |    3
6  |    1   |   50 |    3

我的目标是得到这个结果:

left.ID | left.title | right.status | right.user
   1    |  Title 1   |      0       |      1 
   3    |  Title 3   |      0       |      1 
   4    |  Title 4   |     NULL     |    NULL
   5    |  Title 5   |     NULL     |    NULL 

如果存在与否,我需要正确的信息对状态字段进行一些验证。

以下是我的要求:

SELECT l.title, r.status
FROM left as l
LEFT JOIN right as r ON l.id = r.left_id AND r.user = 1 AND r.status = 0

问题是我得到了标题2的行,我不知道如何删除这一行。 如果有人可以帮助我。

由于

3 个答案:

答案 0 :(得分:1)

这个怎么样?

SELECT l.id, l.title, r.user, r.status
FROM left as l
LEFT JOIN right as r ON l.id = r.left_id 
WHERE r.left_id IS NULL or (r.user = 1 AND r.status = 0)

r.left_id IS NULL将保留不在右表中的左侧记录,or (r.user = 1 AND r.status = 0)将保留具有请求值的左侧记录。

答案 1 :(得分:1)

由于您使用LEFT JOIN,因此无法使用连接条件来过滤状态。而是在WHERE子句中过滤。

SELECT l.title, r.status
FROM left as l
LEFT JOIN right as r ON l.id = r.left_id
WHERE r.ID IS NULL OR (r.status = 0 and r.user = 1)

答案 2 :(得分:0)

试试这样。首先使用ID加入,然后在关闭的位置过滤您的条件

SELECT l.title, r.status
FROM left as l
LEFT JOIN right as r ON l.id = r.left_id 
Where r.user = 1 AND r.status = 0