SQL Внутреннее объединение - PullRequest
0 голосов
/ 04 октября 2011

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

Select P.name
From ((((Select Patientid From Patient) As P
Inner Join (Select Accountno, Patientid From Account) As A1
on P.PatientID = A1.PatientID)
Inner Join (Select Accountno, Itemno From AccountType) As Al 
On A1.Accountno = Al.Accountno)
Inner Join (Select Itemno From Item) As I
On Al.Itemno = I.Itemno)
Group By Al.Itemno
Having Count(*) >= (Select Count(*) FROM AccountType);

Ответы [ 2 ]

1 голос
/ 04 октября 2011

Вот более простой подход, который, я считаю, по сути эквивалентен:

select a.name
from Patient a
inner join Account b on a.PatientID = b.PatientID
inner join AccountType c on b.Accountno = c.Accountno
inner join Item d on c.Itemno = d.Itemno
group by c.Accountno, a.name
having Count(*) >= (Select Count(*) FROM AccountType);

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

Я также обычно называю имена таблиц псевдонимами, используя последовательные буквы - «a», «b», «c», «d», как вы можете видеть.Я обнаружил, что когда я пишу сложные запросы, мне легче следовать за ними.«a» - первая таблица в соединении, «b» - вторая и т. д.

1 голос
/ 04 октября 2011

Звучит так, будто вы просто хотите

SELECT p.name
  FROM patient p
       INNER JOIN account a ON (a.patientID = p.patientID)
       INNER JOIN accountType accTyp ON (accTyp.accountNo = a.accountNo)
       INNER JOIN item i ON (i.itemNo = accTyp.itemNo)
 GROUP BY accTyp.itemNo
HAVING COUNT(*) = (SELECT COUNT(*)
                     FROM accountType);

Обратите внимание, что наличие псевдонима A1 и псевдонима Al довольно запутанноВы хотите выбрать более значимые и более отличительные псевдонимы.

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