SQL: есть 4 таблицы, чтобы найти несопоставимые данные - PullRequest
0 голосов
/ 29 мая 2009

Я всегда делал это обратно в PHP или ASAP, поэтому я решил, что пришло время научиться правильно делать это в SQL. У меня есть следующие 4 таблицы в базе данных:

Категория (Поля: CategoryNumber, Desc) (маленькая таблица с 15 строками)

Media (поля: MediaID, Desc, CategoryNumber и т. Д.) (Огромная таблица с 15 000 строками)

Продажи (поля: дата, MediaID, EmployeeID и т. Д.) (Огромная таблица с 100 000 строк)

Сотрудники (поля: EmployeeID, Name и т. Д.) (Небольшая таблица, содержащая только 20 строк)

Категория только ссылки на СМИ У СМИ есть связи и к Категории и к Продажам. Торговые ссылки на СМИ и сотрудников Сотрудник только ссылки на продажи

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

Я могу написать простой запрос, который ищет несогласованные данные между 2 таблицами, но я понятия не имею, как это сделать, когда я имею дело с 4 таблицами.

Спасибо за ваше время и помощь!

Ответы [ 4 ]

3 голосов
/ 29 мая 2009

Вот мое предложение:

select *
from Category c
where not exists (
    select *
    from Employee e
    inner join Sales s on s.EmployeeId = e.EmployeeId
    inner join Media m on m.MediaID = s.MediaID
    where e.Name = 'Ryan' and m.CategoryNumber = c.CategoryNumber
)

Для запроса всех сотрудников с категориями, в которых они ничего не продавали:

select e.EmployeeName, c.CategoryNumber
from Category c
cross join Employee e
where not exists (
    select *
    from Sales s
    inner join Media m on m.MediaID = s.MediaID
    where c.categoryNumber = m.CategoryNumber
    and s.EmployeeId = e.EmployeeId
)
2 голосов
/ 29 мая 2009
SELECT c.CategoryNumber, c.Desc
FROM   Category c
WHERE NOT EXISTS
(
SELECT *
FROM       Employees e
INNER JOIN Sales     s on s.EmployeeID = e.EmployeeID
INNER JOIN Media     m on m.MediaID    = s.MediaID
WHERE e.Name = "Ryan"
AND   m.CategoryNumber = c.CategoryNumber
)

MS Access, очевидно, нужно много скобок (спасибо, Райан!):

select * 
from Category c 
where not exists 
( select * 
from (     Employee e 
inner join Sales    s on (s.EmployeeId = e.EmployeeId)) 
inner join Media    m on (m.MediaID    = s.MediaID) 
where (e.Name = 'Ryan' and m.CategoryNumber = c.CategoryNumber) )
1 голос
/ 29 мая 2009
select c.desc
from category
left outer join (select s.employeeid,m.categorynumber
         from sales s 
         inner join media m on s.mediaid=m.mediaid
         inner join employee e on e.employeeid=s.employeeid
         where e.name = 'JOE'
         group by employeeid,categorynumber) t on t.categorynumber=c.categorynumber
where s.employeeid is null
0 голосов
/ 29 мая 2009

Модифицированный ответ на основе решения, предоставленного Карлом в Access SQL Syntax:

<code>
select *
from Category c
where not exists (
    select *
    from (Employee e
    inner join Sales s on (s.EmployeeId = e.EmployeeId))
    inner join Media m on (m.MediaID = s.MediaID)
    where (e.Name = 'Ryan' and m.CategoryNumber = c.CategoryNumber)
)</p>

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