2012-05-19 3 views
0

Я новичок в разработке SQL и базы данных и стараюсь работать, если возможно следующее.Oracle: выберите подзапрос и где

У меня есть таблица под названием cats, PKs (cat_id) - это C1, C2, C3 и т. Д. И еще один атрибут с именами кошек (плюс несколько других атрибутов).

У меня есть таблица под названием dog, 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 - 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; 

Я пробовал множество вещей, чтобы объединить их вместе, и я уверен, что нужно использовать подзапрос/вложенный запрос, например, следующим образом, но Havent были в состоянии получить что-нибудь, чтобы работать до сих пор.

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); 

Любые предложения, как это сделать?

ответ

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 

Теперь вы можете масштабировать для различных видов животных, имеет неограниченное количество атрибутов и сохранять значения для различных животных добавили; все без изменения структуры базы данных. Если вы добавили новый атрибут в свою модель, вам придется изменить структуру; и добавьте новый код, который не забавен. Однако, если вы не ожидаете каких-либо изменений в модели; то ваше решение работает нормально.

+0

Я попробую. Из краткого описания, которое я использовал, вы бы сказали, что оно плохо спроектировано?Будет ли я лучше строить таблицы по-другому? (таблицы собак и кошек нельзя комбинировать из-за разных номеров/типов атрибутов) –

+0

Это зависит от того, как «нормализовать» вы хотите получить и как эти данные будут использоваться в долгосрочной перспективе. Ваше решение работает, но в долгосрочной перспективе оно будет иметь проблемы с масштабированием; но если это всего лишь одно, что вы не ожидаете роста; это может сработать для вас. Вы должны использовать союзы в нескольких местах, где подобные данные в той же таблице устраняют необходимость. – xQbert

+0

Первоначально у меня были кошки и собаки вместе в одном столе, но потом у меня было несколько нулей, и я думал, что несколько таблиц лучше нуля? В любом случае союз работает отлично. Раньше этого не было. спасибо –

0

Сделайте одно.

Использовать query1 UNION query2;

И дать имена псевдонимов (имена в qoutes) именам колонок, где разные.

Пример Выберите cat_name "name", cat_id "id" из объединения cat_table select имя_события "name", dog_id "id" из dog_table;

Есть более сложные способы ... но это должно сделать трюк для вас ...

Смежные вопросы