[英]Oracle: Select Subquery and Where
我是SQL和數據庫設計的新手,如果有可能,請嘗試解決。
我有一個名為cats的表,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 - Name 1 - C1 - Henry 2 - C2 - Whiskers 3 - C3 - Grey 4 - D1 - Spotty 5 - D2 - Woof 6 - D3 - Max
單獨執行此操作很容易:
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);
有什么建議怎么做?
不對您的設計發表評論; 但為了幫助您解決此特定問題: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字段,為“狗”提供一個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
現在,您可以為不同類型的動物縮放,擁有無限數量的屬性並為添加的不同動物保留值。 所有這些都無需更改數據庫結構。 如果在模型下添加了新屬性,則必須更改結構。 並添加新的有趣的代碼。 但是,如果您不希望對模型進行任何更改,則可以使用它。 那么您的解決方案就可以正常工作。
做一件事。
使用query1 UNION query2;
並將別名(qoutes中的名稱)賦予不同的列名稱。
示例從cat_table聯合中選擇cat_name“ name”,cat_id“ id”從dog_table中選擇dog_name“ name”,dog_id“ id”;
還有更復雜的方法...但這應該可以幫到您...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.