返す情報を扱うサブクエリやジョイントなどで変更された結果を返すSQL文を作成するにはどうすればよいですか?例えばSQL:*異なる*行の値に基づいて行を選択するための "NOT IN"代替?
:
CREATE TABLE bowlers (
bowling_id int4 not null primary key auto_increment,
name text,
team text
);
誰かが間違って複数のチームであるかもしれない:
INSERT INTO `bowlers` (`name`, `team`) VALUES
('homer', 'pin pals'),
('moe', 'pin pals'),
('carl', 'pin pals'),
('lenny', 'pin pals'),
('homer', 'The homer team'),
('bart', 'The homer team'),
('maggie', 'The homer team'),
('lisa', 'The homer team'),
('marge', 'The homer team'),
('that weird french guy', 'The homer team');
のでhomer
は、彼のチームを決定することはできませんので、彼は両方にあります。 Do'h!
the homer team
にいるすべての人を知りたいのですが、pin pals
チームに所属していない人もいます。私ができる最善のはこれです:
SELECT a.name, a.team
FROM bowlers a where a.team = 'The homer team'
AND a.name
NOT IN (SELECT b.name FROM bowlers b WHERE b.team = 'pin pals');
がで結果の:あなたが知っている、
+-----------------------+----------------+
| name | team |
+-----------------------+----------------+
| bart | The homer team |
| maggie | The homer team |
| lisa | The homer team |
| marge | The homer team |
| that weird french guy | The homer team |
+-----------------------+----------------+
5 rows in set (0.00 sec)
、華麗!
パフォーマンスが数千人の数百人のために、いくつかの行のためのD.グレートにAにBでクエリのサブクエリは、のために実行されようとしている各結果として、かなり悪い苦しむことになります行。
もっと良い方法はありますか?私は主に自己参加がトリックをすると考えていますが、私はそれをどうやって行うかについて私の頭を包み込むことはできません。
はこれを行うには、他の方法があり、また、NOT IN(SELECT ...)
を使用せずに、この種の問題のための名前は何ですか?
あなた自身に戻って左外部結合があなたの望むものです。 –