2015-05-07 2 views
0

У меня есть исходный стол (часть его):Как проверить, существует ли определенный набор идентификаторов?

+--------------------+ 
| E M P L O Y E E | 
+--------------------+ 
| ID | EQUIPMENT | 
+--------------------+ 
| 1 | tv,car,phone | 
| 2 | car,phone  | 
| 3 | tv,phone  | 
+----+---------------+ 

После процесса нормализации я закончил с двумя новыми таблицами:

+----------------+ 
| DICT_EQUIPMENT | 
+----------------+ 
| ID | EQUIPMENT | 
+----------------+ 
| 1 | tv  | 
| 2 | car  | 
| 3 | phone  | 
+----+-----------+ 

+---------------------+ 
| SET_EQUIPMENT | 
+----+--------+-------+ 
| ID | SET_ID | EQ_ID | 
+----+--------+-------+ 
| 1 | 1 | 1 | 
| 2 | 1 | 2 | 
| 3 | 1 | 3 | 
| 4 | 2 | 2 | 
| 5 | 2 | 3 | 
| 6 | 3 | 1 | 
| 7 | 3 | 3 | 
+----+--------+-------+ 

(the piece/part) 
+-----------------+ 
| E M P L O Y E E | 
+-----------------+ 
| ID | EQ_SET_ID | 
+-----------------+ 
| 1 |  1  | 
| 2 |  2  | 
| 3 |  3  | 
+----+------------+ 

И теперь, когда я хочу, чтобы найти правильный SET_ID я могу написать что-то Пример:

SELECT SET_ID 
    FROM SET_EQUIPMENT S1, 
     SET_EQUIPMENT S2, 
     SET_EQUIPMENT S3 
WHERE S1.SET_ID = S2.SET_ID 
    AND S2.SET_ID = S3.SET_ID 
    AND S1.EQ_ID = 1 
    AND S2.EQ_ID = 2 
    AND S3.EQ_ID = 3; 

Возможно, у вас есть идеи по оптимизации этого запроса? как найти правильный набор?

+2

Опишите, что вы пытаетесь понять в запросе. Это не имеет никакого смысла для меня – Rory

+0

Непонятно, каков ваш необходимый результат, пожалуйста, добавьте к вопросу. –

+0

Какую базу данных вы используете? MySQL или Postgres? –

ответ

1

Во-первых, вы должны использовать явный join синтаксис для метода вы используете:

SELECT S1.SET_ID 
FROM SET_EQUIPMENT S1 JOIN 
    SET_EQUIPMENT S2 
    ON S1.SET_ID = S2.SET_ID JOIN 
    SET_EQUIPMENT S3 
    ON S2.SET_ID = S3.SET_ID 
WHERE S1.EQ_ID = 1 AND 
     S2.EQ_ID = 2 AND 
     S3.EQ_ID = 3; 

Запятые в статье from довольно устарели. (И это исправляет ошибку синтаксиса в запросе.)

Альтернативный метод заключается в использовании group by с having пункта:

SELECT S.SET_ID 
FROM SET_EQUIPMENT S 
GROUP BY S.SET_ID 
HAVING SUM(CASE WHEN S.EQ_ID = 1 THEN 1 ELSE 0 END) > 0 AND 
     SUM(CASE WHEN S.EQ_ID = 2 THEN 1 ELSE 0 END) > 0 AND 
     SUM(CASE WHEN S.EQ_ID = 3 THEN 1 ELSE 0 END) > 0; 

Какой метод работает лучше, зависит от целого ряда факторов - например, , используемый вами механизм базы данных, размер таблиц, индексы в таблицах. Вы должны проверить, какой метод работает лучше в вашей системе.

1

Вы нормализовались неправильно. Избавьтесь от set_equipment Измените, пожалуйста, три таблицы: employee, equipment, employee_equipment.

Если вы ищете оборудование для данного сотрудника вы хотите использовать:

select id, equipment 
from equipment eq 
inner join employee_equipment ee on eq.id = ee.eq_id 
inner join employee emp on emp.id = ee.emp_id 
where emp.id = 2