Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Объеденение  [new]
Gedger
Guest
Есть таблица А cвязанная с B, C внешними ключами
Если значение ключа на С в таблице А = null то не хотелось бы делать объединение. Как это можно сделать без промежуточных селектов в переменную?
20 май 04, 12:57    [689939]     Ответить | Цитировать Сообщить модератору
 Re: Объеденение  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Ну и формулировочка вопроса...
20 май 04, 13:06    [689982]     Ответить | Цитировать Сообщить модератору
 Re: Объеденение  [new]
Gedger
Guest
Ok. Метакод:
select *
from A
  inner join B
  on a.b_id = b.id
  if a.c_id is not null then
    inner join C
    on a.c_id = c.id
  end if
20 май 04, 13:10    [690005]     Ответить | Цитировать Сообщить модератору
 Re: Объеденение  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
select *
from A
  inner join B
  on a.b_id = b.id
    inner join C
    on a.c_id = c.id
where c_id is not null
20 май 04, 13:18    [690042]     Ответить | Цитировать Сообщить модератору
 Re: Объеденение  [new]
Gedger
Guest
2 Гавриленко Сергей Алексеевич: ответ неверный. по Вашему запросу просто ничего не вернется, а мне нужно, чтобы вернулись поля из A и B всегда, а из С только если на эту таблицу есть ссылка.

Типа вот так:
select a.*, b.*, case when c.id is not null then c.value end as value
from A
  inner join B
  on a.b_id = b.id
  left join C
  on a.c_id = c.id
where a.id = 1
20 май 04, 13:26    [690075]     Ответить | Цитировать Сообщить модератору
 Re: Объеденение  [new]
Glory
Member

Откуда:
Сообщений: 104760
Типа вот так:
И что разве предложенный вами же вариант работает неправильно ?
20 май 04, 13:31    [690091]     Ответить | Цитировать Сообщить модератору
 Re: Объеденение  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Ну и зачем здесь
case when c.id is not null then c.value end as value
? Для крутости? Не проще написать
select a.*, b.*, ISNULL(c.value, 0) as value
?
20 май 04, 13:33    [690101]     Ответить | Цитировать Сообщить модератору
 Re: Объеденение  [new]
Gedger
Guest
Glory
И что разве предложенный вами же вариант работает неправильно ?

Правильно. Пока писал сам придумал уже :)
Идея была в такой замутке в том, что объединение строилось очень долго. Дошло наконец, что стоить построить индекс.

tpg
Для крутости? Не проще написать

Нет, не для крутости. Не думал, что IsNull может принимать в качестве параметра значение функции. Я показал упрощенную версию. Это плохо?
20 май 04, 13:39    [690143]     Ответить | Цитировать Сообщить модератору
 Re: Объеденение  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
ISNULL может принимать всё что угодно. В BOL так и написано:

ISNULL
Replaces NULL with the specified replacement value.

Syntax
ISNULL ( check_expression , replacement_value )

Arguments
check_expression

Is the expression to be checked for NULL. check_expression can be of any type.
20 май 04, 13:44    [690171]     Ответить | Цитировать Сообщить модератору
 Re: Объеденение  [new]
Glory
Member

Откуда:
Сообщений: 104760
Идея была в такой замутке в том, что объединение строилось очень долго. Дошло наконец, что стоить построить индекс.
Тогда вопрос надо задавать корректно - если вас интересует синтакси то спрашивайте про синтаксис, если не удовлетворяет производительность то и спрашивайте про нее
20 май 04, 13:47    [690183]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить