1

最初のテーブルの列のデータであるネストされた選択のテーブル名でネストされた選択を使用することについて基本的な質問があります。これは、私がやりたいことと、試したが機能しないクエリの例です。

この例では、餌を与えられていない日があるペットを教えてくれるクエリが必要です

table pets

name type feed_schedule
-----------------------
joe  dog  sched_1
sam  cat  sched_2
...

table sched_1

day  feed
---------
sun  yes
mon  no
tues yes
wed  yes
thur no
fri  yes
sat  yes




table sched_2
day  feed
---------
sun  yes
mon  yes
tues yes
wed  no
thur no
fri  yes
sat  yes


SELECT * from pets WHERE (SELECT * FROM pets.feed_schedule WHERE
                       (feed = 'yes')
                       )

このクエリは、テーブル "feed_schedule" にアクセスできないと訴えています。どうすればこれを達成できますか? ありがとうございました!

4

1 に答える 1

0

現在のスキーマでは、動的に生成されたテーブル名を使用する必要があります。クライアント コードまたはストアド プロシージャを使用して動作させることは可能ですが、常に 2 つの手順が必要になります。最初にpetsテーブルをクエリしてスケジュールを含むテーブルの名前を取得し、2 番目の手順で選択したスケジュール テーブルをクエリします。というか、ややこしい。

代わりに、次のように、すべてのスケジュールを保持する単一のテーブル スケジュールを持つようにスキーマを変更することをお勧めします。

CREATE TABLE schedules (
    schedule_id INT NOT NULL,
    feed_day VARCHAR(4),
    feed VARCHAR(3)
)

既存のスケジュールはすべてこのテーブルに保存されます。また、各ペットには整数の schedule_id が保存されている必要があります。

これで、次のような単純な結合を使用して結果を取得できます。

SELECT p.name
FROM pets p, schedules s
WHERE p.schedule_id = s.schedule_id
  AND s.feed = 'yes'
于 2012-11-12T07:33:33.397 に答える