Как вернуть множество значений из одной таблицы и правильное уникальное значение из другой? - PullRequest
2 голосов
/ 24 марта 2012

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

У меня есть эти 2 таблицы:

(Извините, я не уверен, как правильно сделать отступ или табулировать таблицы)

**Table:**
StaffNo Name    DeptNo
DAX001  Joe     DA001
DAX002  Eric    DA001
DAX003  James   DA002
DAX004  Sarah   DA002
DAX005  Simon   DA003
DAX006  Liam    DA003
DAX007  Denis   DA004
DAX008  Lisa    DA004
DAX009  Eoin    DA005
DAX010  Niall   DA005
DAX011  Richard DA006
DAX012  Steven  DA006

**Department**
DeptNo  DeptName
DA001   Security
DA002   Hospitality
DA003   Check-in
DA004   Airport Assistant
DA005   Airport Police
DA006   Maintenance

Я пытаюсь выяснить запрос, который приведет к этому выводу.

**Output**
Name     DeptName
Joe      Security
Eric     Security
James    Hospitality
Sarah    Hospitality
Simon    Check-in
Liam     Check-in
Denis    Airport Assistant
Lisa     Airport Assistant
Eoin     Airport Police
Niall    Airport Police
Richard  Maintenance
Steven   Maintenance

Я сделал DeptNo из таблицы Department как первичный ключ и уникальный. Я сделал DeptNo из таблицы персонала внешним ключом, ссылаясь на DeptNo из таблицы отдела.

Среди других попыток я попробовал следующее, и ни одна из них не сработала.

Попытка 1.

SELECT Staff.Name, Department.DeptName 
FROM Staff, Department
WHERE Department.DeptNo = Staff.DeptNo;

Попытка 2.

SELECT Staff.Name, Department.DeptName 
FROM Staff JOIN Department
WHERE Department.DeptNo = Staff.DeptNo;

Попытка 3.

SELECT Staff.Name, Department.DeptName 
FROM Staff LEFT OUTER JOIN Department 
WHERE Department.DeptNo = Staff.DeptNo; 

Попытка 4.

SELECT Staff.Name, Department.DeptName 
FROM Staff RIGHT OUTER JOIN Department 
WHERE Department.DeptNo = Staff.DeptNo; 

Когда я пытался использовать ...

SELECT Staff.Name, Department.DeptName 
FROM Staff, Department 
WHERE Department.DeptNo = "DAA002"
AND Staff.DeptNo = "DAA002";

.. Я получаю список всех сотрудников с гостеприимством рядом с ними, а не список из двух имен, которые должны иметь "Гостеприимство" рядом с ними.

Любая помощь приветствуется и спасибо заранее.

UPDATE:

Я перепробовал все ваши предложения до и после удаления внешнего ключа.

Перед удалением внешнего ключа я получал по большей части:

выход
Имя DeptName
Джо Секьюри
Эрик Секьюри
Джеймс Секьюрити
Сара Security
Саймон Секьюрити
Лиам Секьюрити
Денис Секьюри
Лиза Секьюрити
Eoin Security
Найл Секьюрити
Ричард Секьюри
Стивен Security

После удаления внешнего ключа я получаю:

Joe Security
Джо Гостеприимство
Джо Регистрация
Помощник по аэропорту Джо
Полиция аэропорта Джо
Джо Техническое обслуживание
Эрик Секьюри
Эрик Гостеприимство
Эрик Регистрация
Эрик Ассистент Аэропорта
Эрик Аэропорт Полиция
Эрик Техническое обслуживание
Джеймс Секьюрити
Джеймс Гостеприимство
Регистрация Джеймса
Помощник по аэропорту Джеймса
Аэропорт Джеймса
Джеймс Техническое обслуживание
Сара Security
Сара Гостеприимство
Сара регистрация
Помощник Сары Аэропорт
Полиция аэропорта Сары
Обслуживание Сары
Саймон Секьюрити
Симон Гостеприимство
Регистрация Саймона
Помощник аэропорта Саймона
Аэропорт Симона
Саймон Техническое обслуживание
Лиам Секьюрити
Лиам Гостеприимство
Лиам Регистрация
Помощник аэропорта Лиама
Полиция аэропорта Лиама
Лиам Техническое обслуживание
Денис Секьюри
Денис Гостеприимство
Денис Заезд
Денис Ассистент аэропорта
Полиция аэропорта Денис
Денис Техническое обслуживание
Лиза Секьюрити
Лиза Гостеприимство
Регистрация Лизы
Помощник аэропорта Лизы
Полиция аэропорта Лизы
Лиза Техническое обслуживание
Eoin Security
Эойн Гостеприимство
Eoin Регистрация
Ассистент аэропорта Эойн
Полиция аэропорта Эойн
Обслуживание Eoin
Найл Секьюрити
Найл Гостеприимство
Регистрация Найла
Помощник Аэропорта Найла
Полиция Аэропорта Найла
Найл Техническое обслуживание
Ричард Секьюри
Ричард Гостеприимство
Ричард Регистрация
Ричард Ассистент Аэропорта
Полиция аэропорта Ричард
Ричард Техническое обслуживание
Стивен Security
Стивен Гостеприимство
Регистрация Стивена
Стивен, ассистент аэропорта
Полиция Аэропорта Стивена
Стивен Техническое обслуживание

Пока что помогаем.

Ответы [ 4 ]

0 голосов
/ 24 марта 2012

прежде всего проверьте свои внешние ключи - вы получили декартово произведение в последнем запросе.Попробуйте этот запрос:

SELECT Staff.Name, Department.DeptName 
FROM Staff JOIN Department
ON Department.DeptNo = Staff.DeptNo;

это должно получить правильный ответ

0 голосов
/ 24 марта 2012

Я предлагаю попробовать

SELECT Staff.Name, Department.DeptName 
FROM Staff INNER JOIN Department 
ON Department.DeptNo = Staff.DeptNo; 

Или вы можете использовать ключевое слово Distinct, если повторные выводы

SELECT DISTINCT Staff.Name, Department.DeptName 
FROM Staff INNER JOIN Department 
ON Department.DeptNo = Staff.DeptNo; 
0 голосов
/ 24 марта 2012

Попытка № 2 была близка.

SELECT s.Name, d.DeptName 
FROM Staff s
INNER JOIN Department d
  ON d.DeptNo = s.DeptNo

или

SELECT Staff.Name, Department.DeptName 
FROM Staff
INNER JOIN Department
  ON Department.DeptNo = Staff.DeptNo

Если это не сработает, не могли бы вы предоставить то, что вы получаете в качестве вывода?

0 голосов
/ 24 марта 2012

Попытка 1 должна работать. Тем не менее, я бы изменил его, чтобы оно было более явным объединением, как вы пытались в Попытке 2 (предложение присоединения не идет в где, а вместо этого в ON)

SELECT Staff.Name, Department.DeptName 
FROM Staff
    JOIN Department
       ON Department.DeptNo = Staff.DeptNo;

Поскольку вы сказали, что вы новичок, может быть полезно просмотреть этот пост в блоге, наглядно показывая, как работают объединения

Кроме того, поиск Google JOIN в Google дает достаточно знаний по этому вопросу:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...