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

Откуда:
Сообщений: 133
Привет! Есть 2 таблицы с разным набором колонок, некоторые из которых имеют одинаковые имена.
Для простоты:
Table1
id,Name,Position,isVisible
1,AAA,3,0
2,BBB,4,1
3,CCC,5,1

Table2
id,Position
2,5
3,4

Нужно получить следующий результат:
если для записи из Table1 есть запись в Table2 (по id),
то значения пересекающихся полей нужно взять из Table2.
Т.е., результат должен быть следующим:

id,Name,Position,isVisible
1,AAA,3,0
2,BBB,5,1
3,CCC,4,1

Заранее спасибо!
25 дек 14, 06:17    [17049247]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать такой запрос  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
select 
  t1.id
, t1.Name
, ISNULL(t2.Position,t1.Position) as Position  -- общие поля
, t1.isVisible
from Table1 t1
left join Table2 t2 on t2.id = t1.id
25 дек 14, 06:59    [17049273]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать такой запрос  [new]
Maxim12345678
Member

Откуда: Ангарск, Санкт-Петербург
Сообщений: 297
LexusR, доброе утро. Не могли бы Вы пояснить, зачем тут ISNULL и Left Join, мы ведь ищем только пересекающиеся значения, простого inner тут не достаточно? Спасибо.

SELECT t1.id, t1.Name, t2.Position, t1.isVisible
FROM Table1 t1 INNER JOIN Table2 t2 on t2.id = t1.id
25 дек 14, 10:08    [17049698]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать такой запрос  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21249
Maxim12345678
простого inner тут не достаточно?

Вы сами говорите, что для некоторых записей из 1 таблицы нет соотв. записей второй таблицы. При INNER JOIN эти записи в конечную выборку не попадут.

Maxim12345678
зачем тут ISNULL

Если для записи из таблицы 1 нет соотв. записи в таблице 2, значение поля из таблицы 2 будет NULL, функция вместо неё выведет в конечный набор запись из таблицы 1.
Впрочем, для унификации лучше использовать функцию COALESCE().
25 дек 14, 10:14    [17049731]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать такой запрос  [new]
Maxim12345678
Member

Откуда: Ангарск, Санкт-Петербург
Сообщений: 297
Akina
Вы сами говорите, что для некоторых записей из 1 таблицы нет соотв. записей второй таблицы. При INNER JOIN эти записи в конечную выборку не попадут.
Если для записи из таблицы 1 нет соотв. записи в таблице 2, значение поля из таблицы 2 будет NULL, функция вместо неё выведет в конечный набор запись из таблицы 1.
Впрочем, для унификации лучше использовать функцию COALESCE().

Спасибо за пояснение. Не обратил внимания, что id, потерянные во второй таблице, тоже должны выводиться.
25 дек 14, 10:21    [17049774]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать такой запрос  [new]
afend
Member

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

большое программисткое спасибо!
А то я что-то затупил.
25 дек 14, 15:30    [17052003]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить