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キーワードは条件に基づいてとテーブルの間の結果の交差を除外する必要があることを理解しています。しかし、それは私が期待したようには機能しませんでした。すべての内容が表示されましたが、一致しなかった行は除外されませんでした。machinesmachines_reachabilitym.id = mr.machine_id

では、結合しなかった行が左側のテーブルであるか右側のテーブルであるかを選択JOINして実際に表示するクエリを実行するにはどうすればよいでしょうか。

4

4 に答える 4

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、一致しないものも含め、すべてのレコードを最初のテーブルに保持します。マシンが到達可能な場合、2 番目のテーブルに一致があります (テーブルにあるだけでなく、レコードにフラグが設定されている必要があると思います)。最後のwhere句は、2 番目のテーブルに一致しないマシンのみを保持します。

于 2013-06-23T15:13:43.037 に答える
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 に答える
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 に答える