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

Откуда: мяуский кот, родом из мая
Сообщений: 1299
-- Объекты
CREATE TABLE #objects
(
    obj_id     int, 
    is_typed     bit     -- признак
    -- otype_id тоже есть,  но в данном случае НЕ важно его значение
)
-- Типы объектов
CREATE TABLE #types
(
    otype_id    int,
    ot_name     varchar(6)
)

-- Если признак #objects.is_typed = 1, то выводить строчки со ВСЕМИ возможными вариантами типов,
-- а если = 0, то выводить одну сткоку для obj_id с пустым значением t.ot_name (или со словами 'без признака')

INSERT INTO #objects
SELECT 1, 0 UNION ALL 
SELECT 2, 1             

INSERT INTO #types
SELECT 1, 'тип 1' UNION ALL 
SELECT 2, 'тип 2' UNION ALL
SELECT 3, 'тип N'

-- В этом примере должно получиться 4(!) строки, 
-- а не 6, как при SELECT * FROM #objects CROSS JOIN #types

---Нужен такой результат:
--obj_id--|--is_typed--|ot_name
--  1     |      0     | 'без признака'   
--  2     |      1     | 'тип 1'
--  2     |      1     | 'тип 2'
--  2     |      1     | 'тип N'

-- Можно это сделать вот так:
CREATE TABLE #result
(
    obj_id   int,
    is_typed bit,
    ot_name  varchar(15)
)

INSERT INTO #result
SELECT o.obj_id, o.is_typed, 'без признака'
FROM #objects o
WHERE o.is_typed = 0
UNION ALL
SELECT o.obj_id, o.is_typed, t.ot_name
FROM #objects o
CROSS JOIN #types t
WHERE o.is_typed = 1

SELECT * FROM #result
-- Но у меня такое ощущение, что я левой пяткой правое ухо почесал,
-- а решение на самом деле должно быть каким-то совсем элементарным

DROP TABLE #objects
DROP TABLE #types
DROP TABLE #result
24 янв 12, 16:53    [11962217]     Ответить | Цитировать Сообщить модератору
 Re: Сам себя перехитрил с joinми?  [new]
left outer join
Guest
-- Объекты
CREATE TABLE #objects
(
    obj_id     int, 
    is_typed     bit     -- признак
    -- otype_id тоже есть,  но в данном случае НЕ важно его значение
)
-- Типы объектов
CREATE TABLE #types
(
    otype_id    int,
    ot_name     varchar(6)
)

-- Если признак #objects.is_typed = 1, то выводить строчки со ВСЕМИ возможными вариантами типов,
-- а если = 0, то выводить одну сткоку для obj_id с пустым значением t.ot_name (или со словами 'без признака')

INSERT INTO #objects
SELECT 1, 0 UNION ALL 
SELECT 2, 1             

INSERT INTO #types
SELECT 1, 'тип 1' UNION ALL 
SELECT 2, 'тип 2' UNION ALL
SELECT 3, 'тип N'

-- В этом примере должно получиться 4(!) строки, 
-- а не 6, как при SELECT * FROM #objects CROSS JOIN #types

---Нужен такой результат:
--obj_id--|--is_typed--|ot_name
--  1     |      0     | 'без признака'   
--  2     |      1     | 'тип 1'
--  2     |      1     | 'тип 2'
--  2     |      1     | 'тип N'

-- Можно это сделать вот так:
CREATE TABLE #result
(
    obj_id   int,
    is_typed bit,
    ot_name  varchar(15)
)

INSERT INTO #result
SELECT o.obj_id, o.is_typed, coalesce(t.ot_name, 'без признака')
FROM #objects o
left join #types t on o.is_typed = 1 
SELECT * FROM #result
-- Но у меня такое ощущение, что я левой пяткой правое ухо почесал,
-- а решение на самом деле должно быть каким-то совсем элементарным

DROP TABLE #objects
DROP TABLE #types
DROP TABLE #result
24 янв 12, 17:26    [11962595]     Ответить | Цитировать Сообщить модератору
 Re: Сам себя перехитрил с joinми?  [new]
начинающий sql-гуру
Member

Откуда: мяуский кот, родом из мая
Сообщений: 1299
left outer join, спасибо, друг!!!
24 янв 12, 17:33    [11962671]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить