我有两个表,我想根据另一个表中的多个记录创建一个SELECT从一个表中提取单个记录。
如果我举一个例子,也许会更清楚。
表:日期。字段:dosID,personID,name,dateIn
1 | 10 | john smith | 2013-09-05
2 | 10 | john smith | 2013-01-25
表:卡片。字段:cardID,personID,cardColor,cardDate
1 | 10 | red | 2013-09-05
2 | 10 | orange | 2013-09-05
3 | 10 | black | 2013-09-05
4 | 10 | green | 2013-01-25
5 | 10 | orange | 2013-01-25
所以我想要的是,如果一个人没有收到“红色”卡,只能从日期表中选择一条记录。我最接近的是:
SELECT name, dateIn FROM dates, cards
WHERE dates.personID = cards.personID AND cardColor != 'red' AND dateIn = cardDate;
但是对于这个查询,由于同一天发出的“橙色”和“黑色”牌,2013-09-05服务日期仍然会被撤销。
我尝试过搜索,但我甚至不确定如何正确描述这个问题,因此我的Google-fu失败了。任何帮助或建议将非常感谢。
答案 0 :(得分:2)
最容易理解的版本会使用NOT EXISTS
进行过滤:
SELECT name, dateIn
FROM dates
WHERE NOT EXISTS(
SELECT *
FROM cards
WHERE cards.personID = dates.personID
AND cards.cardDate = dates.dateIn
AND cards.cardColor = 'red'
)
在sqlfiddle上查看。
答案 1 :(得分:0)
我有点困惑,你得到了非红色的2013-09-05排。
http://sqlfiddle.com/#!2/89260
我尝试使用内连接(如你所写)和外连接。相同的结果。
编辑: 对不起,误解了你的帖子。 eggyal的答案看起来像是我的胜利者。