0

2 つのテーブルがあり、別のテーブルの複数のレコードに基づいて、1 つのテーブルから 1 つのレコードを取得する 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

内部結合(あなたが書いたように)と外部結合を使用して試しました。同じ結果です。

編集:申し訳ありませんが、あなたの投稿を誤解しました。egyal の答えは、私にとって勝者のように見えます。

于 2013-09-24T18:38:44.907 に答える