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

Откуда:
Сообщений: 65
Нужно написать запрос, использующий 3 таблицы, но без использования джоинов.
Вместо этого, выдираю нужные поля из таблиц так:

SELECT t1.pole11, t1.pole12, t2.pole21, t3.pole31, t3.pole32, t3.pole33
FROM (SELECT pole11, pole12 FROM tabl1) t1,
(SELECT pole21 FROM tabl2) t2,
(SELECT pole31, pole32, pole33 FROM tabl3) t3


разумеется, ни к чему хорошему это не приводит.
можно ли как то сопоставить эти таблицы? по аналогии того, как это делается в джоинах - t1.drygoepole1=t2.drygoepole2
23 ноя 12, 14:31    [13519530]     Ответить | Цитировать Сообщить модератору
 Re: SELECT FROM SELECT  [new]
iap
Member

Откуда: Москва
Сообщений: 47083
eXeLe,

запятая - это другая запись CROSS JOIN

Запрет на JOIN - это пари такое?
23 ноя 12, 14:33    [13519560]     Ответить | Цитировать Сообщить модератору
 Re: SELECT FROM SELECT  [new]
iap
Member

Откуда: Москва
Сообщений: 47083
eXeLe
Нужно написать запрос, использующий 3 таблицы, но без использования джоинов.
Вместо этого, выдираю нужные поля из таблиц так:

SELECT t1.pole11, t1.pole12, t2.pole21, t3.pole31, t3.pole32, t3.pole33
FROM (SELECT pole11, pole12 FROM tabl1) t1,
(SELECT pole21 FROM tabl2) t2,
(SELECT pole31, pole32, pole33 FROM tabl3) t3


разумеется, ни к чему хорошему это не приводит.
можно ли как то сопоставить эти таблицы? по аналогии того, как это делается в джоинах - t1.drygoepole1=t2.drygoepole2
WHERE. Это же очевидно!
23 ноя 12, 14:34    [13519575]     Ответить | Цитировать Сообщить модератору
 Re: SELECT FROM SELECT  [new]
Gwa
Guest
eXeLe,
ну пишите например так, where t1.drygoepole1=t2.drygoepole2
23 ноя 12, 14:35    [13519581]     Ответить | Цитировать Сообщить модератору
 Re: SELECT FROM SELECT  [new]
eXeLe
Member

Откуда:
Сообщений: 65
да, вроде того.
если просто сделать WHERE и включить туда условия t1.drygoepole1=t2.drygoepole2, а эти поля соответственно в селект, то итог не соответствует выводу запроса с джойнами. почему - не пойму.
23 ноя 12, 14:35    [13519582]     Ответить | Цитировать Сообщить модератору
 Re: SELECT FROM SELECT  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
eXeLe,

SELECT  *
FROM tabl1, tabl2, tabl3
WHERE tabl1.id =tabl2.id AND tabl2.id =tabl3.id

правильно пришите соответсвие полей (id) как при join.
23 ноя 12, 14:37    [13519604]     Ответить | Цитировать Сообщить модератору
 Re: SELECT FROM SELECT  [new]
Gwa
Guest
eXeLe
да, вроде того.
если просто сделать WHERE и включить туда условия t1.drygoepole1=t2.drygoepole2, а эти поля соответственно в селект, то итог не соответствует выводу запроса с джойнами. почему - не пойму.

потому что join join-ну рознь
когда Вы пишите where -это соответствует inner join
23 ноя 12, 14:37    [13519607]     Ответить | Цитировать Сообщить модератору
 Re: SELECT FROM SELECT  [new]
eXeLe
Member

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

действительно, в оригинале запроса с джойнами, один из джоинов был OUTER JOIN
есть выход из данного положения?
23 ноя 12, 14:38    [13519622]     Ответить | Цитировать Сообщить модератору
 Re: SELECT FROM SELECT  [new]
iap
Member

Откуда: Москва
Сообщений: 47083
OUTER APPLY?
23 ноя 12, 14:40    [13519638]     Ответить | Цитировать Сообщить модератору
 Re: SELECT FROM SELECT  [new]
Гость333
Member

Откуда:
Сообщений: 3683
eXeLe
действительно, в оригинале запроса с джойнами, один из джоинов был OUTER JOIN
есть выход из данного положения?

select a.col1, (select b.col2 from b where b.col1 = a.col1) as col2
from a

Тут мы таблицу b типа залефтджойнили к таблице a.
23 ноя 12, 14:54    [13519785]     Ответить | Цитировать Сообщить модератору
 Re: SELECT FROM SELECT  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Правда, это не пройдёт в случае неуникальных значений col1 :)
23 ноя 12, 14:55    [13519791]     Ответить | Цитировать Сообщить модератору
 Re: SELECT FROM SELECT  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Вот без использования ключевого слова JOIN
declare @person table (person_id int, name varchar(100));
declare @sales table (person_id int, sales_date datetime, value bigint);
insert @person values(1, 'Петя');
insert @person values(2, 'Вася');
insert @person values(3, 'Маша');
insert @sales values(1, '20110101', 300);
insert @sales values(1, '20120101', 500);
insert @sales values(3, '20100101', 400);


select p.person_id, p.name, s.sales_date, s.value
from @person p, @sales s
where p.person_id = s.person_id
union all
select p.person_id, p.name, null, null
from @person p
where not exists(select * from @sales s where s.person_id = p.person_id);
23 ноя 12, 15:05    [13519867]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить