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

Откуда:
Сообщений: 142
Господа!
Есть таблица Table1 с набором полей COD, ID1, ID2, ID3
И таблица Table2 c ID, Name
Для получение запроса вида:
ORD; COD; ID; NAME;
1; 33; 1; "Значение1 из Table2";
2; 33; 2; "Значение2 из Table2";
3; 33; 3; "Значение3 из Table2";
Делаю запрос с оператором UNION

SELECT   1 as ORD, T1.COD, T2.ID, T2.NAME
FROM TABLE1 T1  LEFT OUTER JOIN TABLE2 T2 ON  (T1.ID1 = T2.ID)
WHERE T1.COD=33  -- Условие для выбора из табл. Table1

UNION SELECT 2 as ORD, T1.COD, T2.ID, T2.NAME FROM TABLE1 T1 LEFT OUTER JOIN TABLE2 T2 ON (T1.ID2 = T2.ID) WHERE T1.COD=33 -- Условие для выбора из табл. Table1
UNION SELECT 3 as ORD, T1.COD, T2.ID, T2.NAME FROM TABLE1 T1 LEFT OUTER JOIN TABLE2 T2 ON (T1.ID3 = T2.ID) WHERE T1.COD=33 -- Условие для выбора из табл. Table1
ORDER BY ORD

Где ORD поле для сортировки по уровню запроса.
Возможно ли получение такого же запроса без использования UNION
А то условие WHERE приходится вставлять аж в трех местах, да и на скорость запроса такое объединение трех запросов влияет существенно!?

Спасибо за совет! Andronick.
14 июн 04, 08:20    [740382]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли построить такой запрос без UNION  [new]
Luchkin Dmitry
Member

Откуда: Новосибирск -> Ангарск -> Братск -> Мск
Сообщений: 1921
SELECT   CASE WHEN T1.COD=33  -- Условие для выбора из табл. Table1

THEN 1 WHEN T1.COD=33 -- Условие для выбора из табл. Table1 :)))
THEN 2 WHEN T1.COD=33 -- Условие для выбора из табл. Table1 тоже ха-ха
THEN 3 ELSE 4 END as ORD, T1.COD, T2.ID, T2.NAME FROM TABLE1 T1 LEFT OUTER JOIN TABLE2 T2 ON (T1.ID1 = T2.ID)
??
14 июн 04, 10:30    [740443]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли построить такой запрос без UNION  [new]
Раз (1)
Member

Откуда: Е-бург
Сообщений: 193
Может быть так (без ORD)?

SELECT
  T1.COD, 
  T2.ID, 
  T2.NAME
FROM 
  TABLE1 T1  
  LEFT OUTER JOIN 
    TABLE2 T2 
  ON  (T1.ID1 = T2.ID OR T1.ID2 = T2.ID OR T1.ID3 = T2.ID)
WHERE 
  T1.COD=33

Не помню как в запросах порядковые номера строк выводить :)
14 июн 04, 10:33    [740446]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли построить такой запрос без UNION  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
declare @t table (id int, id2 int, id3 int,a int, c int)
declare @t2 table (id int, n varchar(10))

insert into @t (id,id2,id3,a,c)values(1,null,null,33,14)
insert into @t (id,id2,id3,a,c)values(2,null,null,33,24)
insert into @t (id,id2,id3,a,c)values(null,3,null,33,34)
insert into @t (id,id2,id3,a,c)values(null,null,4,33,44)
insert into @t2(id,n) values (1,'value1')
insert into @t2(id,n) values (2,'value2')
insert into @t2(id,n) values (3,'value3')
insert into @t2(id,n) values (4,'value4')

select t.*,t2.n
from @t t
  left outer join @t2 t2 on (t.id =t2.id or t.id2 = t2.id or t.id3  = t2.id )
where t.a = 33

вот как вариант
14 июн 04, 10:37    [740448]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить