2015-05-15 3 views
0

У меня есть следующие таблицы:SQL выбрать с тремя уровнями внешнего ключа косвенностью

component_cmp  [id], id_cty_cmp*, ... 
comp_structure_cst [id_cty_cst*, property_cst], validation_cst, ... 
comp_value_cva  [id_cmp_cva*, property_cva], value_cva, ... 
comp_type_cty  [id_cty], ... 

Кронштейны являются первичные ключи, * Внешний ключ (примерно)

ComponentType имеет много Component с, каждый Component имеет много CompValue s. Каждый CompType владеет многими CompStructure, которые являются своего рода «шаблонами» для CompValue.

Схема немного грязная, да.

Что-то вроде этого (грубой диаграммы ER):

CompTypeCty -+-----< CompStructureCst - - - - indirect - 
|              | 
+-------< ComponentCmp -+----< CompValueCva - - - - - - 

Я хочу, чтобы выбрать строки из CompValueCva, которые имеют validation_cst равные заданное значение. Это действительно противное обращение, но я считаю, что это можно сделать в SQL.

До сих пор я придумал это, но это не так (дает мне грузовик неправильных записей дубликатов):

select cva.* 
from comp_value_cva cva 
left join component_cmp cmp on cva.id_cmp_cva = cmp.id 
left join comp_structure_cst cst on cst.id_cty_cst = cmp.id_cty_cmp 
where cst.validation_cst = 'celsius'; 

(это SQLite синтаксис, но синтаксис MySQL будет работать для меня тоже)

ответ

0

Nevermind, я был глупым и не понимал, что у меня есть «сложные внешние косвенные ключи».

Правильный запрос:

select cva.* 
from comp_value_cva cva 
left join component_cmp cmp on cva.id_cmp_cva = cmp.id 
left join comp_structure_cst cst on (cst.id_cty_cst = cmp.id_cty_cmp AND cst.property_cst = cva.property_cva) 
where cst.validation_cst = 'celsius' 
+0

Вы на самом деле не нужно 'LEFT' присоединяется для этого. (или, по крайней мере, вы не были бы в mysql) – Uueerdo

+0

Хорошо, покажите мне более быстрый/лучший способ, я все еще могу принять его ^^ – MightyPork

+0

Я не уверен, будет ли он быстрее, потому что внутренний оптимизатор запросов может делайте это уже, но «INNER JOIN» может помочь, если оптимизатор запросов тупой. Кроме того, я не знаю точно, не зная больше о вашей структуре данных, но я предполагаю, что таблица 'cmp' может даже не понадобиться в этом запросе, поскольку похоже, что у вас есть прямая ссылка на' cva' в 'cst'. Но да, я мог бы недооценивать трудность описания ваших отношений лаконично. – Uueerdo

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