我有一个机器表,以及一个表示这些机器在不同时间内可达性的表。
machines
id name
1 machine1
2 machine2
3 machine3
4 machine4
machines_reachability
machine_id is_reachable time
1 0 (whatever)
2 1 (whatever)
3 0 (whatever)
1 1 (whatever)
2 0 (whatever)
3 0 (whatever)
1 1 (whatever)
2 1 (whatever)
3 1 (whatever)
我正在尝试使用JOINS查找具有NO可达性记录的机器(即机器4)。这可以用另一种方式完成,但我需要通过连接来更好地理解它
我尝试了以下
SELECT * FROM machines m LEFT OUTER JOIN machines_reachability mr ON m.id = mr.machine_id
我理解这应该输出整个左表内容(即机器),并且OUTER
关键字应该基于条件m.id = mr.machine_id
排除machines
和machines_reachability
表之间结果的交集。但这并没有像我预期的那样奏效。它显示了所有内容,但没有排除不匹配的行。
那么,我如何运行JOIN
查询来实际显示没有连接的行,无论是左表还是右表。
选择不同的机器。机器自然左外部连接的名称machines_rechability其中is_reachable为空
使用联接:
select *
from machines m left outer join
machines_reachability mr
on m.id = mr.machine_id and
mr.is_reachable = 1
where mr.machine_id is NULL
这个想法是从所有的机器开始。left join
保留第一个表中的所有记录,即使是不匹配的记录。当机器可访问时,第二个表中有一个匹配项(我认为记录必须设置标志,并且必须在表中)。最后的where
子句只保留第二个表中没有匹配项的机器。
怎么样
SELECT * from machines where not exists
(
select machine_id from machines_reachability
where machines.id = machines_reachability.machine_id
);
SELECT *
FROM machines m
JOIN machines_reachability mr
ON (m.id <> mr.machine_id)
GROUP BY m.id;