0

我有两个表,我想创建一个 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 让我失望了。任何帮助或建议将不胜感激。

4

2 回答 2

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上查看。

于 2013-09-24T18:35:08.687 回答
0

我有点困惑,你得到了非红色的 2013-09-05 行。

http://sqlfiddle.com/#!2/89260

我尝试使用内部联接(如您所写)和外部联接。结果相同。

编辑:对不起,误解了你的帖子。eggyal 的回答对我来说似乎是赢家。

于 2013-09-24T18:38:44.907 回答