0

私は SQL とデータベースの設計に不慣れで、次のことが可能かどうかを調べようとしています。

私は猫と呼ばれるテーブルを持っています.PK(cat_id)はC1、C2、C3などであり、猫の名前を持つ別の属性(および他の複数の属性)です。

私は犬と呼ばれるテーブルを持っています.PK(dog_id)はD1、D2、D3などであり、犬の名前を持つ別の属性(および他の複数の属性)です。

次に、属性 Cat_Dog_ID (C1、C2、C3、D1、D2、D3 など) を持つ動物、PK 1、2、3、4、5、6 などと呼ばれるテーブルがあります。

次にやりたいことは、猫と犬の名前を戻す select ステートメントです。

An_Id - Cat_Dog_ID - 名前
1 - C1 - ヘンリー
2 - C2 - ひげ
3 - C3 - グレー
4 - D1 - むら
5 - D2 - ウーフ
6 - D3 - 最大

個別に行うのは簡単です:

SELECT a.an_id, a.cat_dog_id, c.cat_name 
FROM animal a, cat c
WHERE a.cat_dog_id = c.cat_id;

SELECT a.an_id, a.cat_dog_id, d.dog_name 
FROM animal a, dog d
WHERE a.cat_dog_id = d.dog_id;

これらを組み合わせるために多くのことを試しましたが、次のようにサブクエリ/ネストされたクエリを使用する必要があることは確かですが、これまでのところ何も機能していません。

SELECT a.an_id, a.cat_dog_id, c.cat_name "Name"
FROM animal a, cat c
WHERE a.cat_dog_id = c.cat_id
AND (SELECT a.an_id, a.cat_dog_id, d.dog_name "Name"
FROM animal a, dog d
WHERE a.cat_dog_id = d.dog_id);

SELECT a.an_id, a.cat_dog_id FROM animal a
where a.cat_dog_id = c.cat_id in (select c.cat_name "Name" from cat c)
WHERE a.cat_dog_id = d.dog_id in (select d.dog_name "Name" from dog d);

これを行う方法について何か提案はありますか?

4

2 に答える 2

1

あなたのデザインについてコメントをしない; しかし、この特定の問題の解決を支援するために:UNIONはあなたが求めているものです

SELECT a.an_id, a.cat_dog_id, c.cat_name 
FROM animal a, cat c
WHERE a.cat_dog_id = c.cat_id
UNION
SELECT a.an_id, a.cat_dog_id, d.dog_name 
FROM animal a, dog d
WHERE a.cat_dog_id = d.dog_id;

さて、私がデザインに疑問を呈する理由は、猫/犬を動物と呼ばれるテーブルに抽象化し、「猫」用と「犬」用のtypeIDフィールドを持つことができるからです。犬と猫は同じ属性を共有しているため、テーブルが異なりません。これはデータの正規化と呼ばれます。純粋な意味では、同じデータを複製することは決してありません。ただし、パフォーマンスの観点から、複製する価値がある場合があります。あなたの問題の文脈を知らなければ、この場合に正規化することが賢明であるかどうかはわかりません。しかし、それはおそらくそうです。

----設計の問題に対処するには、次のことを考慮してください。

Animal
--------------------
AnimalID
TypeID
Name
Birthdate
Gender
...etc

Type
--------
TypeId
TypeName - Cat or Dog or (now scales to other types of animals if needed w/o redsign of table)


Attributes
-----------
AttributeID
Name 
DataType (Numeric, String, date, etc)

TypeAttributes
-------------
AttributeID
TypeID

AnimalsAttributes
---------------
AttributeID
AnimalID
Value

これで、さまざまな種類の動物に合わせてスケーリングしたり、属性の数を無制限にしたり、追加したさまざまな動物の値を保持したりできます。すべてデータベース構造を変更する必要はありません。モデルの下に新しい属性を追加した場合は、構造を変更する必要があります。面白くない新しいコードを追加します。ただし、モデルへの変更が予想されない場合は、その後、ソリューションは正常に機能します。

于 2012-05-19T18:25:10.207 に答える
0

1 つのことを行います。

query1 UNION query2 を使用します。

そして、別の列名にエイリアス名(qoutesの名前)を付けます。

例 cat_name "name"、cat_id "id" を cat_table から選択します。 union select dog_name "name"、dog_id "id" from dog_table;

もっと複雑な方法があります...しかし、これはあなたのためにトリックを行うはずです...

于 2012-05-19T18:30:47.800 に答える