0

我是 SQL 和数据库设计的新手,并试图解决以下问题。

我有一个名为猫的表,PKs (cat_id) 是 C1、C2、C3 等和另一个带有猫名的属性(加上多个其他属性)。

我有一个名为 dogs 的表,PKs (dog_id) 是 D1、D2、D3 等,另一个带有狗名的属性(加上多个其他属性)。

然后我有一个名为动物的表,PK 1、2、3、4、5、6 等,其属性为 Cat_Dog_ID(C1、C2、C3、D1、D2、D3 等)。

然后我想做的是一个选择语句,它将带回猫和狗的名字,例如。

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 UNION 查询2;

并为不同的列名提供别名(qoutes 中的名称)。

示例 Select cat_name "name", cat_id "id" from cat_table union select dog_name "name", dog_id "id" from dog_table;

还有更复杂的方法......但这应该对你有用......

于 2012-05-19T18:30:47.800 回答