Вероятно сте срещали често подобен проблем:
Имам главна таблица, която описва обектите, които ме интересуват - да речем служители. Имам таблица, която описва възможните стойности на едно от свойствата на обектите - да речем владеене на чужд език. И естествено имам таблица, която описва връзката между първите две - N:N (съвсем стандартна схема за случая).
Ето примерна схема (за PostgreSQL):
CREATE TABLE employee (
employee_id serial PRIMARY KEY,
name varchar(20)
);
CREATE TABLE skill (
skill_id serial PRIMARY KEY,
name varchar(20)
);
CREATE TABLE employee_skill (
employee_id integer,
skill_id integer,
CONSTRAINT employee_skill_employee_id_fkey FOREIGN KEY (employee_id) REFERENCES employee(employee_id),
CONSTRAINT employee_skill_skill_id_fkey FOREIGN KEY (skill_id) REFERENCES skill (skill_id),
CONSTRAINT employee_skill_employee_id_key UNIQUE (employee_id, skill_id)
);
Бих искал да изведа всички служители, които владеят два определени езика. Следната заявка прави нещо подобно, но хич не ми харесва (като я видите, ще разберете защо):
SELECT
е.employee_id,
е.name,
COUNT(s.skill_id)
FROM
employee AS e
INNER JOIN
employee_skill AS es
ON
e.employee_id=es.employee_id
INNER JOIN
skill AS s
ON
s.skill_id=es.skill_id AND s.skill_id IN (1, 2)
GROUP BY
e.employee_id,
e.name
HAVING
COUNT(s.skill_id)>=2;
Тук "(1, 2)" са идентификаторите за два от езиците (да речем немски и френски), взети от таблицата "skill". А двойката в "COUNT(s.skill_id)>=2" е защото търсените умения са два броя.
Някакви идеи за по-проста и универсална заявка?
---
What's worse - ignorance or indifference? Who knows? Who cares?Редактирано от Schultz на 19.09.05 15:37.