Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помомгите с запросом  [new]
Malleus
Member

Откуда:
Сообщений: 167
Помогите плз:

Есть таблица A, у которой есть два внешних ключа B_ID и C_ID, которые ссылаются, соответственно, на таблицы B и C. У таблицы B в свою очередь есть внешний ключ C_ID который тоже ссылается на таблицу C.

Нужно получить все записи из таблицы С на которые ссылаются записи из таблицы А либо напрямую либо через таблицу B.

Вот такая штука работает безобразно медленно:

SELECT
	c.*
FROM
	A a
	LEFT JOIN B b ON a.b_id = b.id
	INNER JOIN C c ON ((a.c_id = c.id) OR (b.c_id = c.id))

Что здесь не так?
14 окт 09, 17:50    [7786804]     Ответить | Цитировать Сообщить модератору
 Re: Помомгите с запросом  [new]
iljy
Member

Откуда:
Сообщений: 8711
Malleus,

план смотрели? Не так - условие соединения, оно OR содержит, а это почти всегда сканирование таблицы. Сделайте 2 left join на с - один по a.C_ID, другой по b.C_ID.
14 окт 09, 17:54    [7786832]     Ответить | Цитировать Сообщить модератору
 Re: Помомгите с запросом  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
SELECT c.* FROM A a JOIN C c ON a.c_id=c.id
UNION ALL
SELECT c.* FROM A a JOIN B b ON a.b_id=b.id JOIN C c ON b.c_id=c.id;
14 окт 09, 17:55    [7786842]     Ответить | Цитировать Сообщить модератору
 Re: Помомгите с запросом  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
iap
SELECT c.* FROM A a JOIN C c ON a.c_id=c.id
UNION ALL
SELECT c.* FROM A a JOIN B b ON a.b_id=b.id JOIN C c ON b.c_id=c.id;
Нет, точнее так:
SELECT c.* FROM A a JOIN C c ON a.c_id=c.id
UNION
SELECT c.* FROM A a JOIN B b ON a.b_id=b.id JOIN C c ON b.c_id=c.id;
14 окт 09, 17:56    [7786844]     Ответить | Цитировать Сообщить модератору
 Re: Помомгите с запросом  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Предлагать нуно не только эквивалентный запрос, но ещё желательно спросить, а что реально надо, потому что возможно, надо вот так:
SELECT	c.*
FROM	          A a
	LEFT JOIN B b ON b.id = a.b_id
	     JOIN C c ON c.id = IsNull(b.c_id,a.c_id)
14 окт 09, 19:55    [7787340]     Ответить | Цитировать Сообщить модератору
 Re: Помомгите с запросом  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Чёрд, невнимательно прочитал первый пост.
Если представлено условие полностью, то конечно вариант iap. Хотя бывают и на русском не могут сказать что надо. <выкрутился> ;)
14 окт 09, 19:59    [7787353]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить