2013-08-31 2 views
0

Я новичок в SQL и у меня есть домашнее задание. Я сделал все вопросы правильно, но все еще не смог разобраться в этих двух запросах, поэтому, пожалуйста, помогите, если сможете. Я ценю вас заранее.Как решить эти два запроса?

У меня есть четыре таблицы:

EMPLOYEE which conatin the attributes (Fname, Minit, Lname, Ssn, Bdate, Address, Sex, Salary, Super_ssn, Dno) 

Table DEPARTMENT have the columns (Dname, Dnumber, Mgr_ssn, Mgr_start_date) 

Table PROJECT have the columns (Pname, Pnumber, Plocation, Dnum) 

Table DEPENDENT (Essn, Dependent_name, Sex, Bdate, Relationship) 

Q1. Для отдела, который контролирует большинство проектов, укажите его имя? я придумал этот запрос, но все это только дает мне каждый отдел сколько проектов это контролировать, но не может заставить его работать, как дать мне только тот, который имеет наиболее :(

SELECT Dname, COUNT(distinct Pnumber) as NumberOfProjects 
FROM Department, Project 
WHERE Dnum = Dnumber 
GROUP BY Dname; 

Q2. Восстановите имена и Ssn работника, которые имеют более иждивенцев, чем любые другие сотрудники?

Я придумал это, но ИДК, почему он не работает. Я продолжаю получать сообщение об ошибке

SELECT Fname, Lname, Ssn 
FROM Employee 
WHERE max((SELECT COUNT(*) 
     FROM Dependent 
     WHERE Ssn = Essn)); 

BTW Я использую MySQL Workbench 5.2. Язык только SQL разрешен

+0

@ Rahul Tripathi Большое вам спасибо за редактирование :) –

+0

Вы отметили свой вопрос тремя различными системами СУБД. Какой из них вы используете? –

ответ

1

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

Если вы ЗАКАЗЫВАЕТСЯ по числу проектов, по убыванию, правильный отдел будет первым в списке. И если вы LIMIT 1, вы выберете только этот отдел.


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

(SELECT Essn, COUNT(Dependent_name) AS Dependents 
FROM Dependent 
GROUP BY Essn 
ORDER BY Dependents DESC); 
0

Вы можете использовать этот запрос для Q1:

SELECT * FROM(
    SELECT Dname, COUNT(distinct Pnumber) as NumberOfProjects 
    FROM Department, Project 
    WHERE Dnum = Dnumber 
    GROUP BY Dname 
ORDER BY COUNT(distinct Pnumber) desc nulls last) 
LIMIT 1 
0

Вы можете использовать этот запрос для Q2:

SELECT Fname, Lname, Essn FROM(
    SELECT Essn, Fname, Lname, COUNT(Dependent_name) as NumberOfDependents 
    FROM Dependent, Employee 
    WHERE Essn = Ssn 
    GROUP BY Essn 
ORDER BY NumberOfDependents desc) 
LIMIT 1 

Это неэффективно если вы запустили его с помощью подзапроса, как описано выше, потому что ур соединяет две большие таблицы Dependent и Employee перед извлечением сотрудника с макс. иждивенцы. Но это сработает!

+0

Подзапросы не являются неэффективными, они похожи на проекцию на запрос, вы можете проверить это, посмотрев план выполнения на подзапросах – VahiD