Нужна помощь с запросом (с помощью объединений) - PullRequest
0 голосов
/ 06 марта 2009

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

Таблица чековой книжки содержит то, что мне нужно, чтобы получить
Таблица квитанций содержит ссылку на таблицу владельцев
Владелец таблицы знает, с какой чековой книжкой она связана

Мне нужно получать чековые книжки только в том случае, если в квитанциях есть строки, связанные с ним (через таблицу владельцев). Я не знаю точно, как это сделать, и это вроде круто. Вот что я попробовал:

SELECT chk.ID, chk.Description FROM tblCheckbook chk
LEFT JOIN tblOwner o
ON r.OwnerID = o.ID
INNER JOIN tblCashReceipts r
ON chk.ID = o.CheckbookID

Но сервер sql жалуется, что "Не удалось связать многокомпонентный идентификатор" r.OwnerID "."
Что мне нужно сделать, чтобы заставить это работать?

Ответы [ 4 ]

2 голосов
/ 06 марта 2009

В тот момент, когда вы выполняете левое соединение, определение r (tblCashReceipts) еще не встречалось. Вы, вероятно, захотите что-то вроде:

SELECT chk.ID, chk.Description FROM tblCheckbook chk
LEFT JOIN tblOwner o
ON chk.ID = o.CheckbookID
INNER JOIN tblCashReceipts r
ON o.ID = r.OwnerID
1 голос
/ 06 марта 2009

Я думаю, что вы почти у цели, у вас просто изменились условия соединения. Попробуйте это:

SELECT chk.ID, chk.Description FROM tblCheckbook chk
LEFT JOIN tblOwner o ON o.CheckbookID = chk.ID 
INNER JOIN tblCashReceipts r ON r.OwnerID = o.ID 

Или:

SELECT chk.ID, chk.Description FROM tblCheckbook chk
LEFT JOIN tblOwner o ON o.CheckbookID = chk.ID 
LEFT JOIN tblCashReceipts r ON r.OwnerID = o.ID 
WHERE r.OwnerID IS NOT NULL 

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

1 голос
/ 06 марта 2009

У каждого объединения есть предложение on, которое описывает отношение. Нужно просто поставить отношения с правильными объединениями.

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

select c.ID, c.Description
from tblCheckBook c
inner join tlbOwner o on o.CheckbookID = c.ID
inner join tblCashReceipts r on r.OwnerID = o.ID
0 голосов
/ 06 марта 2009

Знают ли чеки, к какой чековой книжке они принадлежат?

Присоединяйтесь к чековым книжкам через таблицу квитанций.

Владелец -> Квитанции -> Чековая книжка

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