powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Объединение нескольких таблиц в ASA 8
18 сообщений из 18, страница 1 из 1
Объединение нескольких таблиц в ASA 8
    #32862493
Я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Я
Гость
Чего-то я не пойму совсем, вот решил перейти с 5.5 на 8
ранее такой запрос:

select *
from a,b,c
where a.a*=b.a and b.b*=c.b

отрабатывал на ура (он точно не нарушает ограничения накладываемые на Transact диалект :-) )

а в 8 материться по типу:

invalid expression in WHERE clause of Transact-SQL outer join

что за бред?

мне что теперь все запросы переделывать на left join right join, чего то не очень это радостно для меня :-(
или я чего-то элементарного не догоняю!
просьба помочь! заранее спасибо!
...
Рейтинг: 0 / 0
Объединение нескольких таблиц в ASA 8
    #32862559
Я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Я
Гость
Может быть конечно проблема в билде, но тогда я в ауте в полном от Sybase!
а какой у восьмерке последний билд и версия, которая реально работоспособна???
...
Рейтинг: 0 / 0
Объединение нескольких таблиц в ASA 8
    #32862591
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Теперь судя по всему не поддерживается. Почитайте этот документ, там все расписано (о Вашем случае на стр. 18 - "Chained (nested)outer joins").
...
Рейтинг: 0 / 0
Объединение нескольких таблиц в ASA 8
    #32862637
michael_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LEFT OUTER JOIN не поможет, тут проблема не в синтаксисе, а в функционале. Они действительно перестали поддерживать 2 левых объединения вида есть T1*=T2 и T2*=T1. Мы такие запросы на временные таблицы переделывали. Се ля ви.
...
Рейтинг: 0 / 0
Объединение нескольких таблиц в ASA 8
    #32862652
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
michael_LEFT OUTER JOIN не поможет, тут проблема не в синтаксисе, а в функционале. Они действительно перестали поддерживать 2 левых объединения вида есть T1*=T2 и T2*=T1. Мы такие запросы на временные таблицы переделывали. Се ля ви.
Эквивалент "неподдерживаемого" запроса на джойнах:
Код: plaintext
1.
2.
select *
from (a left join b on a.a=b.a) 
  left join c on b.b=c.b
Поэтому я не знаю, чего Вы там через времянки переделывали. В документе, ссылку на который я привел, обьясняется, что отказ от TSQL семантики был продиктован неоднозначностью интрепретации соединения. Так что никаких Се ля ви :)
...
Рейтинг: 0 / 0
Объединение нескольких таблиц в ASA 8
    #32862654
Я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Я
Гость
Все понятно, очень жаль, я в АУТЕ!!!
отсанусь ка я лудше на 5!
5 РУЛЕЗ!!!
...
Рейтинг: 0 / 0
Объединение нескольких таблиц в ASA 8
    #32862666
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЯВсе понятно, очень жаль, я в АУТЕ!!!
отсанусь ка я лудше на 5!
5 РУЛЕЗ!!!
Смотря для чего. Для небольших БД с малым кол-вом подключений и не сильно навороченной в БД бизнес-логикой действительно рулез. А если чего то сложнее делать - к джойнам привыкать придеться - даже вон Ораклистов уже заставили к ним привыкать :)
...
Рейтинг: 0 / 0
Объединение нескольких таблиц в ASA 8
    #32862681
Фотография Рыжий Кот
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а разве синтаксис key join не удобнее, не надо вписывать поля.

...
Рейтинг: 0 / 0
Объединение нескольких таблиц в ASA 8
    #32862690
Я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Я
Гость
ASCRUS - что ты сказал это конечно понятно! из-за этого в общем то и планировался переход, а в таком случае я еще ОЧЕНЬ ХОРОШО подумаю, а на кой!
но представь сколько надо исправить в реально работающем проекте :-(, причем не таком уж и маленьком!!!
Всем большое спасибо за ответы!
хотя политика партии, мне не совсем понятна все равно!
чем им не покатили такие вещи, щас почитаю, что Вы посоветовали и может проникнусь сим Великим Смыслом :-)
Еще раз фенкс!
буду думать :-(, что я делать край как не люблю :-)
...
Рейтинг: 0 / 0
Объединение нескольких таблиц в ASA 8
    #32863666
michael_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 ASCRUS

Виноват, при синтаксисе LEFT OUTER JOIN все работает. Мои товарищи меня поправили - переходили на времянки еще во времена ASA 6, тогда несколько билдов подряд 2 левых объединения глючило - иногда задваивало записи в запросе. Зато при переходе на времянки получили приемущество - возможность для пользователя наложения фильтров на все поля в запросе.
...
Рейтинг: 0 / 0
Объединение нескольких таблиц в ASA 8
    #32863741
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЗато при переходе на времянки получили приемущество - возможность для пользователя наложения фильтров на все поля в запросе.
На джойнах это тоже делается без проблем:
Код: plaintext
1.
2.
3.
select *
from (a left join b on a.a=b.a and b.Field = @FilterValue2)
  left join c on b.b=c.b and c.Field = @FilterValue3
where a.Field = @FilterValue1;
я уже настолько привык в джойны выносить фильтры на присоединяемые таблицы, что в WHERE фактически стоят фильтры на первую таблицу запроса и вычисляемые в запросе поля. Зато очень читабельно - сразу видны и условия соединения и фильтрации, сгрупированные по каждой таблице запроса.
...
Рейтинг: 0 / 0
Объединение нескольких таблиц в ASA 8
    #32863835
Фотография Александр Гoлдун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рыжий Кота разве синтаксис key join не удобнее, не надо вписывать поля.

Он то удобнее, но я недавно наступил на веселые грабли, связанные именно с частым употреблением таких джойнов. В одной из удаленных реплицируемых баз пришлось поудалять часть FK. А клиентский софт единый для всех баз. Естественно, появилась куча сообщений о том, что ASA не знает как связать таблицы. Пришлось переписывать такие запросы и на будущее сделать памятку - использовать сокращенный JOIN только в "одноразовых" ручных запросах.
...
Рейтинг: 0 / 0
Объединение нескольких таблиц в ASA 8
    #32863873
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Согласен однозначно - в логике БД ни в коем случае нельзя употреблять KEY JOIN-ы. Граблей может быть великое множество, которые больно будут бить по лбу. А вот в разовых запросах под себя штука первоклассная :)
...
Рейтинг: 0 / 0
Объединение нескольких таблиц в ASA 8
    #32864427
michael_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUSНа джойнах это тоже делается без проблем:
Код: plaintext
1.
2.
3.
select *
from (a left join b on a.a=b.a and b.Field = @FilterValue2)
  left join c on b.b=c.b and c.Field = @FilterValue3
where a.Field = @FilterValue1;
я уже настолько привык в джойны выносить фильтры на присоединяемые таблицы, что в WHERE фактически стоят фильтры на первую таблицу запроса и вычисляемые в запросе поля. Зато очень читабельно - сразу видны и условия соединения и фильтрации, сгрупированные по каждой таблице запроса.

А фильтр на поля таблицы b? По правилам левого OUTER JOIN число строк в запросе при этом не уменьшиться, а поля из второй таблицы будут NULL. И это правильно, но как обяснить это пользователю, который хочет получить выборку? Кроме времянок решения не знаю. То есть
select... into #T ...
select * from #T
И любые выборки по любым полям.
...
Рейтинг: 0 / 0
Объединение нескольких таблиц в ASA 8
    #32864530
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что то я Вас не пойму - в моем запросе "b.Field = @FilterValue2" и есть фильтр на поле "Field" таблицы "b", который накладывается на нее, но не ограничивает записи в таблице "a". Вы это имеете ввиду или что то еще ?
...
Рейтинг: 0 / 0
Объединение нескольких таблиц в ASA 8
    #32864845
michael_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица документов T1
Num Summa Val
1 100 1
2 200 2
3 300 NULL
4 400 2

Есть таблица валют T2
Val Val_name
1 USD
2 EUR

Необходим табличный просмотр вида
Num Summa Val_name
1 100 USD
2 200 EUR
3 300 NULL
4 400 EUR

Получить его мы можем запросом
select Num, Summa, Val_name
from T1, t2
where t1.val*=t2.val

Пользователь хочет при работе с табличным просмотром иметь возможность наложить фильтр на любое поле просмотра, например Val_name='USD', если написать

select Num, Summa, Val_name
from T1, t2
where t1.val*=t2.val
and Val_name='USD'

то получим
Num Summa Val_name
1 100 USD
2 200 NULL
3 300 NULL
4 400 NULL

А по постановке надо
Num Summa Val_name
1 100 USD

Вот и делаем
select Num, Summa, Val_name
into #t
from T1, t2
where t1.val*=t2.val

Далее
select Num, Summa, Val_name
from #t

И потом, при наложении фильтра

select Num, Summa, Val_name
from #t
where Val_name='USD'
...
Рейтинг: 0 / 0
Объединение нескольких таблиц в ASA 8
    #32865038
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну во первых странно мне видеть суммы по документам с неизвестной валютой, да ладно, возьмем Ваш пример за рабочий. Посмотрим что получим.

авторНеобходим табличный просмотр вида
Num Summa Val_name
1 100 USD
2 200 EUR
3 300 NULL
4 400 EUR

Получить его мы можем запросом
select Num, Summa, Val_name
from T1, t2
where t1.val*=t2.val
вариант на джойнах:
Код: plaintext
1.
2.
SELECT Num, Summa, Val_name
FROM t1
  LEFT JOIN t2 ON t2.val = t1.val;
далее
авторПользователь хочет при работе с табличным просмотром иметь возможность наложить фильтр на любое поле просмотра, например Val_name='USD', если написать

select Num, Summa, Val_name
from T1, t2
where t1.val*=t2.val
and Val_name='USD'

то получим
Num Summa Val_name
1 100 USD
2 200 NULL
3 300 NULL
4 400 NULL
аналогично получим такой вывод результата на запросе:
Код: plaintext
1.
2.
SELECT Num, Summa, Val_name
FROM t1
  LEFT JOIN t2 ON t2.val = t1.val and t2.val_name = 'USD';

далее мне от Вас удивительно это слышать:
авторА по постановке надо
Num Summa Val_name
1 100 USD

Вот и делаем
select Num, Summa, Val_name
into #t
from T1, t2
where t1.val*=t2.val

Далее
select Num, Summa, Val_name
from #t

И потом, при наложении фильтра

select Num, Summa, Val_name
from #t
where Val_name='USD'
гм, кто мешает написать вот так:
Код: plaintext
1.
2.
3.
SELECT Num, Summa, Val_name
FROM t1
  LEFT JOIN t2 ON t2.val = t1.val
WHERE t2.val_name = 'USD';
таким образом если в предыдущем запросе мы вешали фильтр на соединение, то здесь мы вешаем фильтр на результат после соединения, все это элементарно видно по плану запроса.

Так вот - Ваши рассуждения как раз показывают о неоднозначности соединений TSQL и Ваши извраты с времянками как раз и предназначены для их обхода. В случаях с джойнами мы можем явно регулировать и комбинировать любые способы соединений и фильтров. Вывод один - учите матчасть, то бишь джойны :)
...
Рейтинг: 0 / 0
Объединение нескольких таблиц в ASA 8
    #32865354
michael_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Там где валюта NULL - документ рублевый. Есть там еще поле и "сумма в национальной валюте"

Согласен, Ваш запрос

SELECT Num, Summa, Val_name
FROM t1
LEFT JOIN t2 ON t2.val = t1.val
WHERE t2.val_name = 'USD';

дает нужный результат.

Пошел учить матчасть. :)
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Объединение нескольких таблиц в ASA 8
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]