Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 как эмулировать "left join" без какого либо джоина кроме "from t, c" и без "union"  [new]
Var79
Member

Откуда:
Сообщений: 890
пример проблемы (можно запустить на любой базе sql 2005+):
DECLARE  @t table(k int not null);
DECLARE  @c table(f int not null);
insert into @t(k) values
(1), (2), (3), (4), (5), (6), (7), (8)
insert into @c(f) values
(3), (4), (5), (6), (7), (8), (9), (10)
--*********************************************
select *
from @t t left join @c c on t.k = c.f

select *
from @t t, @c c
where (t.k = c.f) or (c.f is null)

естественно
(c.f is null)
не сработает так как нет null значений

для любопытных
sql строится поверх "конструктора" который не позволяет писать "left join" и "union" для не связанных таблиц (hql NHibernate)
6 апр 11, 14:02    [10479293]     Ответить | Цитировать Сообщить модератору
 Re: как эмулировать "left join" без какого либо джоина кроме "from t, c" и без "union"  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
t.k *= c.f
6 апр 11, 14:06    [10479326]     Ответить | Цитировать Сообщить модератору
 Re: как эмулировать "left join" без какого либо джоина кроме "from t, c" и без "union"  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Konst_One
t.k *= c.f
В SQL2008 такого нет
6 апр 11, 14:09    [10479351]     Ответить | Цитировать Сообщить модератору
 Re: как эмулировать "left join" без какого либо джоина кроме "from t, c" и без "union"  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Konst_One
t.k *= c.f

это если уровень совместимости с 2000 поставить...вряд ли там такое...

Var79,
а full join тож нелься?

вот по этому я и не люблю всякие орм извращения
6 апр 11, 14:10    [10479369]     Ответить | Цитировать Сообщить модератору
 Re: как эмулировать "left join" без какого либо джоина кроме "from t, c" и без "union"  [new]
Konst_One
Member

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

sql2005 у автора, про 2008 я и не обещал и вообще пусть на оракл с такими темами идёт
6 апр 11, 14:10    [10479377]     Ответить | Цитировать Сообщить модератору
 Re: как эмулировать "left join" без какого либо джоина кроме "from t, c" и без "union"  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
DECLARE  @t table(k int not null);
DECLARE  @c table(f int not null);
insert into @t(k) values
(1), (2), (3), (4), (5), (6), (7), (8)
insert into @c(f) values
(3), (4), (5), (6), (7), (8), (9), (10)
--*********************************************
select t.k, (SELECT c.f FROM @c c WHERE c.f=t.k) f
from @t t;
6 апр 11, 14:16    [10479433]     Ответить | Цитировать Сообщить модератору
 Re: как эмулировать "left join" без какого либо джоина кроме "from t, c" и без "union"  [new]
Var79
Member

Откуда:
Сообщений: 890
Konst_One
t.k *= c.f

ща попробую :) но думаю что нельзя, у меня MS SQL 2008

SomewhereSomehow
Var79,
а full join тож нелься?

нельзя
6 апр 11, 14:17    [10479443]     Ответить | Цитировать Сообщить модератору
 Re: как эмулировать "left join" без какого либо джоина кроме "from t, c" и без "union"  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Konst_One
iap,

sql2005 у автора, про 2008 я и не обещал и вообще пусть на оракл с такими темами идёт
У него 2005+
и характерный синтаксис VALUES(),(),...
6 апр 11, 14:17    [10479451]     Ответить | Цитировать Сообщить модератору
 Re: как эмулировать "left join" без какого либо джоина кроме "from t, c" и без "union"  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21241
where t.k = c.f or t.k not in (select c1.f from @c c1)
?
6 апр 11, 14:17    [10479452]     Ответить | Цитировать Сообщить модератору
 Re: как эмулировать "left join" без какого либо джоина кроме "from t, c" и без "union"  [new]
Var79
Member

Откуда:
Сообщений: 890
iap
DECLARE  @t table(k int not null);
DECLARE  @c table(f int not null);
insert into @t(k) values
(1), (2), (3), (4), (5), (6), (7), (8)
insert into @c(f) values
(3), (4), (5), (6), (7), (8), (9), (10)
--*********************************************
select t.k, (SELECT c.f FROM @c c WHERE c.f=t.k) f
from @t t;

Оно! Спасибо :-)
6 апр 11, 14:19    [10479465]     Ответить | Цитировать Сообщить модератору
 Re: как эмулировать "left join" без какого либо джоина кроме "from t, c" и без "union"  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
DECLARE  @t table(k int not null);
DECLARE  @c table(f int not null);
insert into @t(k) values
(1), (2), (3), (4), (5), (6), (7), (8)
insert into @c(f) values
(3), (4), (5), (6), (7), (8), (9), (10)
--*********************************************
select t.k, c.f
from @t t OUTER APPLY (SELECT c.f FROM @c c WHERE c.f=t.k) c;
6 апр 11, 14:20    [10479472]     Ответить | Цитировать Сообщить модератору
 Re: как эмулировать "left join" без какого либо джоина кроме "from t, c" и без "union"  [new]
Var79
Member

Откуда:
Сообщений: 890
Akina
where t.k = c.f or t.k not in (select c1.f from @c c1)
?

нет так как null не добавятся
6 апр 11, 14:20    [10479478]     Ответить | Цитировать Сообщить модератору
 Re: как эмулировать "left join" без какого либо джоина кроме "from t, c" и без "union"  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Var79
iap
DECLARE  @t table(k int not null);
DECLARE  @c table(f int not null);
insert into @t(k) values
(1), (2), (3), (4), (5), (6), (7), (8)
insert into @c(f) values
(3), (4), (5), (6), (7), (8), (9), (10)
--*********************************************
select t.k, (SELECT c.f FROM @c c WHERE c.f=t.k) f
from @t t;

Оно! Спасибо :-)
Отругается, если какому-нибудь t.k соответствуют более одного c.f
6 апр 11, 14:21    [10479483]     Ответить | Цитировать Сообщить модератору
 Re: как эмулировать "left join" без какого либо джоина кроме "from t, c" и без "union"  [new]
Var79
Member

Откуда:
Сообщений: 890
iap
DECLARE  @t table(k int not null);
DECLARE  @c table(f int not null);
insert into @t(k) values
(1), (2), (3), (4), (5), (6), (7), (8)
insert into @c(f) values
(3), (4), (5), (6), (7), (8), (9), (10)
--*********************************************
select t.k, c.f
from @t t OUTER APPLY (SELECT c.f FROM @c c WHERE c.f=t.k) c;

во спс еще лучше, если синтаксис пропустит :-)
6 апр 11, 14:21    [10479492]     Ответить | Цитировать Сообщить модератору
 Re: как эмулировать "left join" без какого либо джоина кроме "from t, c" и без "union"  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Var79
iap
DECLARE  @t table(k int not null);
DECLARE  @c table(f int not null);
insert into @t(k) values
(1), (2), (3), (4), (5), (6), (7), (8)
insert into @c(f) values
(3), (4), (5), (6), (7), (8), (9), (10)
--*********************************************
select t.k, c.f
from @t t OUTER APPLY (SELECT c.f FROM @c c WHERE c.f=t.k) c;

во спс еще лучше, если синтаксис пропустит :-)
А для чего это? Викторина какая-нибудь?
Куда приезжать за призом?
6 апр 11, 14:23    [10479501]     Ответить | Цитировать Сообщить модератору
 Re: как эмулировать "left join" без какого либо джоина кроме "from t, c" и без "union"  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
Var79
пример проблемы (можно запустить на любой базе sql 2005+):


select t.k, (select top 1 c.f from @c c where t.k = c.f) as f
from @t t

Var79
для любопытных
sql строится поверх "конструктора" который не позволяет писать "left join" и "union" для не связанных таблиц (hql NHibernate)
Отменить кривой конструктор?
6 апр 11, 14:23    [10479502]     Ответить | Цитировать Сообщить модератору
 Re: как эмулировать "left join" без какого либо джоина кроме "from t, c" и без "union"  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
Var79
iap
DECLARE  @t table(k int not null);
DECLARE  @c table(f int not null);
insert into @t(k) values
(1), (2), (3), (4), (5), (6), (7), (8)
insert into @c(f) values
(3), (4), (5), (6), (7), (8), (9), (10)
--*********************************************
select t.k, c.f
from @t t OUTER APPLY (SELECT c.f FROM @c c WHERE c.f=t.k) c;

во спс еще лучше, если синтаксис пропустит :-)
Ну уж если JOIN не пропускает, то насчёт OUTER APPLY можно даже не пробовать :-)
6 апр 11, 14:24    [10479518]     Ответить | Цитировать Сообщить модератору
 Re: как эмулировать "left join" без какого либо джоина кроме "from t, c" и без "union"  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
А может лучше вьюшку сделать и в орм её подсунуть ?
6 апр 11, 14:42    [10479634]     Ответить | Цитировать Сообщить модератору
 Re: как эмулировать "left join" без какого либо джоина кроме "from t, c" и без "union"  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
alexeyvg
Ну уж если JOIN не пропускает, то насчёт OUTER APPLY можно даже не пробовать :-)
Может, ТС пари выиграть надо?
6 апр 11, 14:47    [10479680]     Ответить | Цитировать Сообщить модератору
 Re: как эмулировать "left join" без какого либо джоина кроме "from t, c" и без "union"  [new]
Var79
Member

Откуда:
Сообщений: 890
iap
alexeyvg
Ну уж если JOIN не пропускает, то насчёт OUTER APPLY можно даже не пробовать :-)
Может, ТС пари выиграть надо?
6 апр 11, 15:05    [10479851]     Ответить | Цитировать Сообщить модератору
 Re: как эмулировать "left join" без какого либо джоина кроме "from t, c" и без "union"  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Var79
iap
пропущено...
Может, ТС пари выиграть надо?
Когда мы будем делить наши деньги?
6 апр 11, 15:07    [10479873]     Ответить | Цитировать Сообщить модератору
 Re: как эмулировать "left join" без какого либо джоина кроме "from t, c" и без "union"  [new]
Var79
Member

Откуда:
Сообщений: 890
используется hql NHibernate
left join там свой, и синтаксис немного другой
видимо если он парсит знакомый токен то ругается что не тот синтаксис, а если токен не знаком то видимо пропускает как есть

просто есть view, на котрый нет FK, а раз нет FK то и мап не построить, (для своего проекта никогда не буду юзать HQL и Criteria)
6 апр 11, 15:11    [10479913]     Ответить | Цитировать Сообщить модератору
 Re: как эмулировать "left join" без какого либо джоина кроме "from t, c" и без "union"  [new]
Var79
Member

Откуда:
Сообщений: 890
alexeyvg
Var79
пример проблемы (можно запустить на любой базе sql 2005+):


select t.k, (select top 1 c.f from @c c where t.k = c.f) as f
from @t t

Var79
для любопытных
sql строится поверх "конструктора" который не позволяет писать "left join" и "union" для не связанных таблиц (hql NHibernate)
Отменить кривой конструктор?

я бы давно но сказано "NHibernate hql" пока никакого "sql" так что пока поиски в заданных рамках
6 апр 11, 15:13    [10479931]     Ответить | Цитировать Сообщить модератору
 Re: как эмулировать "left join" без какого либо джоина кроме "from t, c" и без "union"  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
Var79
используется hql NHibernate
left join там свой, и синтаксис немного другой
видимо если он парсит знакомый токен то ругается что не тот синтаксис, а если токен не знаком то видимо пропускает как есть

просто есть view, на котрый нет FK, а раз нет FK то и мап не построить, (для своего проекта никогда не буду юзать HQL и Criteria)
А схемабиндинг для вьюхи не поможет етому хибернейту поять, что надо?
6 апр 11, 15:42    [10480216]     Ответить | Цитировать Сообщить модератору
 Re: как эмулировать "left join" без какого либо джоина кроме "from t, c" и без "union"  [new]
Var79
Member

Откуда:
Сообщений: 890
alexeyvg
А схемабиндинг для вьюхи не поможет етому хибернейту поять, что надо?

можно подробней что за схема биндинг?
6 апр 11, 15:48    [10480273]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить