2012-01-09 2 views
1

Я пересмотренная к экзамену, и я немного борюсь с запросами SQL ..Выполнение SQL запроса (кросс таблицы)

Задачи для меня:

написать запрос SQL в список полные имена всех клиентов, которые посещающие Allen Moore "S-классов, в алфавитном порядке фамилии (т.е. Lname столбцов)

Clie нт

Cid Fname Lname Fitness 
C129 Julie Summer 1 
C525 Max Hedrum 3 
C628 John Long 3 
C772 Warren Peace 2 
C829 Anna Heart 2 

Программа

Code Title Fitness 
AR02 Aerobics 2 
EN99 Endurance 3 
TU10 Tune-Up 1 
UB01 Upper-Body 2 
YG02 Yoga 1 

Персонал

Sid Fname Lname Position Salary 
S09 Jenny Sayer Psychologist 23500 
S22 Allen Moore Instructor 21500 
S28 Polly Purves Instructor 19000 
S35 Jim Shoe Instructor 18000 
S55 Mark Spencer Manager 25500 

Класс

Code Sid Cid 
AR02 S35 C772 
EN99 S22 C525 
TU10 S35 C129 
UB01 S28 C628 
YG02 S22 C829 
YG02 S22 C12 

Является ли это что-то вроде:

SELECT Cliente.Fname, Cliente.Lname 
FROM Staff, Class, Cliente 
WHERE Staff.Sid = Class.Sid AND Staff.Fname = "Allen" AND Staff.Lname = "Moore 
AND Class.Cid = Cliente.Cid 
GROUP BY Cliente.lName ASC; 

Спасибо!

+2

Вам нужно будет использовать 'order by' вместо 'group by'. И лучше использовать объединения, а не все в этом. – Kyra

+2

Не справедливое голосование - вопрос прост, но разумен, и усилия были поставлены на поиск ответа. –

+0

Есть незначительная проблема с Cliente (French?) Vs Client в имени таблицы. GROUP BY неверен (он должен отображать оба столбца, потому что они не являются агрегатами, а затем он не наносит никакого вреда, за исключением, вероятно, медленных действий, это не гарантирует порядок вывода, с одним столбцом, это просто неправильно). И ваш код не использует более современные (как в, начиная с 1992 года) стандартные ссылки на SQL-соединения. Однако, помимо этих ошибок, запрос, как мне кажется, будет работать, как написано. У вас есть ряд предложений по написанию запроса с явным соединением среди ответов. –

ответ

1

Предложение GROUP BY в запросе должен идти, вы не должны ничего агрегировать. Я бы предпочел синтаксис SQL92 для объединения:

SELECT 
    Client.Fname, Client.Lname 
FROM 
    Staff 
INNER JOIN 
Class ON Staff.Sid = Class.Sid AND Staff.Fname = "Allen" AND Staff.Lname = "Moore" 
INNER JOIN 
Client ON Class.Cid = Cliente.Cid 
ORDER BY Cliente.lName ASC; 
+0

Строго, GROUP BY не является необходимым, но не наносит никакого вреда, кроме, возможно, замедляет запрос. Однако это не то же самое, что предложение ORDER BY и не гарантирует, что данные будут представлены в отсортированном порядке. (Может также иметь значение, если есть два разных сотрудника, называемых «Джейн Доу».) –

+0

@jonathan leffler: группа, используемая в вопросе, сильно вредит, поскольку список столбцов не должен содержать столбцов без какой-либо совокупной функции , которые не являются частью классовой оговорки. – Mithrandir

+0

Ах - честный комментарий. MySQL позволит вам избежать этого, но Standard SQL (все остальные СУБД) не будет. Виноват. –

2
select c.fname + ' ' + c.lname 
from Client c 
inner join Class cl 
on c.cid = cl.cid 
inner join Staff s 
on s.sid = cl.sid 
where s.fname = 'allen' 
and s.lname = 'moore' 
order by c.lname 
+1

Если вы собираетесь обманывать и выполнять поиск персонального идентификатора Аллена Мура, вам не нужно вступать в стол персонала. Если вы замените предложение WHERE на 'WHERE s.Fname =" Allen "AND S.Lname =" Moore ", тогда вы будете чисты и потребуется соединение с персоналом. –

+0

@JonathanLeffler хороший пункт, фиксированный. Спасибо за исправление. –

2

Использование различных псевдонимов и более популярной конвенции для объединения, но ваш запрос должен работать. Кроме того, ORDER BY по возрастанию по умолчанию, так что ASC является обязательным ...

SELECT CLNT.Fname, CLNT.Lname 
FROM Class AS CLS 
    INNER JOIN Client AS CLNT ON CLS.Cid = CLNT.Cid 
    INNER JOIN Staff AS S ON CLS.Sid = S.Sid 
WHERE S.Fname = 'Allen' 
     AND S.Lname = 'Moore' 
ORDER BY CLNT.Lname; 
+0

Спасибо, теперь я понял. Это в основном то же самое, что и ответ Митрандира. – Ziai

1

Поскольку ни информации из других таблиц фактически не используется, почему РЕГИСТРИРУЙТЕСЬ вообще?

SELECT FName, LName 
FROM Client 
WHERE 
    Cid IN (
     SELECT Cid 
     FROM Class 
     WHERE Sid = (
      SELECT Sid FROM Staff WHERE FName = 'Allen' AND LName = 'Moore' 
     ) 
    ) 
ORDER BY LName ASC; 
+0

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

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