我有这个小作业: 找那些有投影仪的房间,但不是白板。
CREATE TABLE Equipment
(
room VARCHAR(15),
type VARCHAR(20)
);
INSERT INTO Equipment VALUES ('Dreyer-201','projector');
INSERT INTO Equipment VALUES **('Zuse-127','projector');**
INSERT INTO Equipment VALUES ('Shannon-164','projector');
INSERT INTO Equipment VALUES ('Dreyer-201','whiteboard');
INSERT INTO Equipment VALUES **('Zuse-127','whiteboard');**
INSERT INTO Equipment VALUES ('Shannon-164','whiteboard');
这是我的答案:
SELECT DISTINCT room, type
FROM Equipment
WHERE type = 'projector' AND NOT type = 'whiteboard'
它正在工作 - 但我的输出列出了Zuse-127房间。我知道投影机和白板都是独立的,但我该如何解决这个问题呢?所以Zuse-127的房间没有显示出来。
答案 0 :(得分:0)
尝试使用NOT IN()
用于属于白板的房间
SELECT DISTINCT room, type
FROM Equipment
WHERE type = 'projector' AND room
NOT IN (SELECT `room` FROM Equipment WHERE type = 'whiteboard' )
答案 1 :(得分:0)
自联接可能比使用GROUP BY或子查询的解决方案表现更好。
SELECT e.room, e.type
FROM Equipment AS e
LEFT OUTER JOIN Equipment AS e2
ON e.room = e2.room AND e2.type = 'whiteboard'
WHERE e.type = 'projector'
AND e2.type IS NULL;
在(type,room)
上添加索引以获得最佳效果。