簡體   English   中英

Oracle:選擇子查詢和位置

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM