0

みなさん、こんにちは。SQLクエリに問題があり、解決策が見つかりません。

私のデータベースには、Mytable1とMytable2の2つのテーブルがあります。Mytable1にはidCalendar、idPlayer、datePlayingの列が含まれ、Mytable2にはidPlayerとnamePlayerの列が含まれます。

Mytable1で、プレイしなかったプレイヤーの名前をforeach日付で抽出したいと思います。

たとえば、Mytable1(プレーヤーとプレイ日が含まれています):

idCalendar|idPlayer|datePlaying

1         |     1  | 05/01/2012
2         |     2  | 06/01/2012
3         |     3  | 08/01/2012
4         |     2  | 05/01/2012

Mytable2(すべてのプレイヤー名が含まれています):

idPlayer|namePlayer

1  | P1
2  | P2
3  | P3
4  | P4

次の結果を表示するビューを作成したいと思います。

ViewResult(日付までにプレイしていないプレイヤー):

datePlaying | playerName

05/01/2012  | P2
05/01/2012  | P3
06/01/2012  | P1
06/01/2012  | P3
08/01/2012  | P1
08/01/2012  | P2

ご覧のとおり、この情報で結果が必要です。-2012年5月1日、P2とP3はプレイされていません。-2012年6月1日、P1とP3はプレイされていません。-2012年8月1日、P1とP2はプレイされていません。

私は十分に明確になっていると思います。前もって感謝します。

4

2 に答える 2

3

おそらく、これが機能するのと同じくらい単純なものです。

select
    d.datePlaying, p.namePlayer
from
    table2 p
cross join 
    (select distinct datePlaying from table1) d
left join
    table1 t on t.idPlayer = p.idPlayer and t.datePlaying = d.datePlaying
where
    t.idPlayer is null

ちなみに、プレーヤー以外がプレーした日付がある場合はどうなりますか?table2にはエントリがありません。あなたは気にしますか、それともプレーヤーのいずれかがプレーすべきだった日付を表すために3番目のテーブルがあるべきですか。この日付テーブルは、エイリアス「d」の相互結合テーブルを置き換えるために使用されます。

于 2012-05-26T20:10:05.187 に答える
0

私はこのコンピューターに便利なデータベースを持っていないので、現時点ではこれをテストすることはできません-私はそれに取り組んでいきます。

SELECT     DISTINCT a.datePlaying, b.playerName
FROM       Mytable1 a
INNER JOIN Mytable2 b
        ON a.idPlayer = b.idPlayer
WHERE      NOT EXISTS (
           SELECT idPlayer
           FROM   Mytable1 a2
           WHERE  a.datePlaying = a2.datePlaying)
ORDER BY   a.datePlaying
于 2012-05-26T17:38:45.643 に答える