0

我有一个机器表,以及一个表示这些机器跨时间可达性的表。

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查找没有可达性记录的机器(即 machine4 。这可以通过其他方式完成,但我需要通过连接来更好地理解它。

我尝试了以下

SELECT * FROM machines m LEFT OUTER JOIN machines_reachability mr ON m.id = mr.machine_id

我知道这应该输出整个左表内容(即机器),并且OUTER关键字应该根据条件排除machines和表之间的结果的交集。但这并没有像我预期的那样奏效。它显示了所有内容,但不排除匹配的行。machines_reachabilitym.id = mr.machine_id

那么,我如何运行一个JOIN查询来实际显示连接的行,无论是左表还是右表。

4

4 回答 4

1

选择不同的machines.names,其中机器自然左外连接machines_rechability,其中is_reachable为空

于 2013-06-23T15:09:53.087 回答
1

使用连接:

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子句只保留第二个表中没有匹配的机器。

于 2013-06-23T15:13:43.037 回答
0

关于什么

SELECT * from machines where not exists 
( 
      select machine_id from machines_reachability 
      where machines.id = machines_reachability.machine_id 
);
于 2013-06-23T15:03:16.620 回答
0
SELECT *
FROM machines m
JOIN machines_reachability mr
  ON (m.id <> mr.machine_id)
GROUP BY m.id;
于 2013-06-23T14:59:47.280 回答