2012-01-12 7 views
1

これはプログラマーが頻繁に遭遇するものですが、私は決してこのようなことを試みませんでした。1つのクエリで2つのテーブルの2つのオブジェクトを(SELECT)するにはどうすればよいですか?

つまり、私は説明します。そう、テーブルZooから値を取得する必要があります:

@"SELECT z.predator, z.prey FROM Zoo AS z WHERE [email protected]" 

これで、すべての値をリストに取得できます。私はそのクエリの詳細をグリッドに表示する必要があります。 z.predator値とz.prey値(これはそれぞれのidsのためのものです)を持っているので、エンドユーザーに表示するために意味のある値を設定する必要があります。だから今私はこのような何かをするかもしれません:

これは、プログラムを遅くすることができます。一度にすべての詳細をクエリできますか?このようなもの:

SELECT (SELECT * FROM ANIMAL WHERE id=z.predator), 
      (SELECT * FROM ANIMAL WHERE id=z.prey) 
    FROM Zoo AS z WHERE [email protected] 

私は新しい大きなオブジェクトに値を読み取ることができますか?あるいはこれは悪い習慣と考えられていますか?

更新日:これを行うのが標準的な方法ですか?または、私が最初に述べたように個別に人口を埋めることをお勧めしますか?

更新2:私は必要なときに正確に質問を投稿しないという重大な間違いをしたようです。私は、アクセスクエリのかっこ組み立てで、私の要求を満たすためにここから回答を微調整できると思った。ここで

は私の実際のクエリは次のようになり方法です:

SELECT z.predator, p.lifeSpan, z.prey 
FROM Zoo AS z 
INNER JOIN Plants AS p ON p.parent_id=z.id 
WHERE [email protected] 

は、実際に私はINNERは別のテーブルにすでにクエリをJOINを持っていました。今度は、INNER JOINとWHERE条件を満たすz.predator(およびAnimalsテーブルの対応する値)、p.lifeSpan、z.prey(およびAnimalテーブルの対応する値)の値を取得する必要があります。

擬似コードは次のようになります。

SELECT (SELECT * FROM ANIMAL WHERE id=z.predator), p.lifeSpan, (SELECT * FROM ANIMAL WHERE id=z.prey) 
FROM Zoo AS z INNER JOIN Plants AS p ON p.parent_id=z.id 
WHERE [email protected] 

今まで私のここでの回答からの要求、ない成功を拡張するのは簡単でなければなりません。私は試しました:

SELECT a1.*, p.lifeSpan, a2.* 
FROM Zoo AS z 
INNER JOIN Plants AS p ON p.parent_id=z.id 
INNER JOIN Animal AS a1 ON (a1.id=z.predator) 
INNER JOIN Animal AS a2 ON (a2.id=z.prey) 
WHERE [email protected] 

ブラケットの有無にかかわらず、このバリエーションは多くあります。上記のクエリはどのようにして適切に構成できますか?

答えて

2

に参加してみてください

SELECT a1.*, p.lifeSpan, a2.* 
FROM Zoo AS z 
INNER JOIN Plants AS p ON p.parent_id=z.id 
INNER JOIN Animal AS a1 ON (a1.id=z.predator) 
INNER JOIN Animal AS a2 ON (a2.id=z.prey)"; 
WHERE [email protected] 

は声明の中から、セミコロンを捨てます。二重引用符も破棄してください。

SQLを単純化するために、WHERE句を今のところ除外してください。

次に、Access 'dbエンジンが複数の結合に必要なカッコの問題に対処するためには、より良い立場にいるはずです。

SELECT a1.*, p.lifeSpan, a2.* 
FROM 
    ((Zoo AS z 
    INNER JOIN Plants AS p ON p.parent_id=z.id) 
    INNER JOIN Animal AS a1 ON a1.id=z.predator) 
    INNER JOIN Animal AS a2 ON a2.id=z.prey 

注意ON式を囲む括弧を破棄しました。単純なON式はそれらを必要としません。 ONの複合式がある場合は、次のようにかっこが必要です。

ON (p.parent_id=z.id AND p.foo = z.bar) 

私が提案したサンプルクエリは正しいと思われます。 (それがうまくいけば、WHERE句をもう一度追加してください)しかし、私はAccessのクエリデザイナを使って結合を設定するので、かっこの配置に細心の注意を払っていません...そしてdbエンジンが必要とするかっこを追加します。

同じことをお勧めします。あなたがAccessのコピーをインストールせずにDot.NetからAccessデータベースを使用している場合は、実際にコピーを取得する必要があります。そのデータベースのネイティブな開発ツールを使用せずにデータベースを使用しようとすると、ミトンを身につけている間にタイプしようとするようなやりがいのない挑戦です。私はコメントを投稿が、とにかく後

+0

正直言って、あなたのプロフィールを見てから助けてくださいました。あなたはアクセススペシャリストのようです:D – nawfal

+0

二重引用符とセミコロンのことですが、それは明らかに誤植です。そうですね、私はクエリデザイナーを使用します。それはあなたが話しているクエリウィザードですか? – nawfal

+0

omGそれはちょうどうまくいきました:D一つの質問で、このような複数のオブジェクトを1つのクエリで照会するのが標準的な方法ですか? – nawfal

4
SELECT pred.col1 AS PredCol1, ..., pred.colx AS PredColx, 
     prey.col1 AS PreyCol1, ..., prey.colx AS PreyColx 
    FROM Zoo z 
     INNER JOIN Animal pred 
      ON z.predator = pred.id 
     INNER JOIN Animal prey 
      ON z.prey = prey.id 
    WHERE z.preyType = @carnivore 

代わりに、代わりにこのようなものが必要な場合があります。

SELECT 'Predator' AS AnimalType, pred.* 
    FROM Zoo z 
     INNER JOIN Animal pred 
      ON z.predator = pred.id 
    WHERE z.preyType = @carnivore 
UNION ALL 
SELECT 'Prey' AS AnimalType, prey.* 
    FROM Zoo z 
     INNER JOIN Animal prey 
      ON z.prey = prey.id 
    WHERE z.preyType = @carnivore 
+0

ちょうど 'pred.PredatorName、prey.PrayName' – PedroC88

+0

おかげでジョーにSELECTを変更 、私はこれを同化させ... – nawfal

+0

PedroC88 @、彼はここで何が... – nawfal

1

は、この最新のクエリの試みを思わテーブル

SELECT aPrey.Name as PreyName, aPredatior.Name as PredatorName 
FROM Zoo AS z 
LEFT JOIN Animal AS aPrey On aPrey.id= z.prey 
LEFT JOIN Animal AS aPredatior On aPredatior.id= z.predator 
WHERE [email protected] 
+0

ありがとう..おまけに。 – nawfal

+0

また、このクエリでは、 'Animal'テーブルへの外部キーを適切に作成していない限り、DBNULLをaPrey.NameとaPredator.Nameとして考慮する必要があるかもしれません。 – PedroC88

+0

@ PedroC88はい私は.. – nawfal

関連する問題