VirtualIreland.ru - Виртуальная Ирландия
Вернуться   VirtualIreland.ru - Виртуальная Ирландия > Живем в Ирландии > IT и Связь

IT и Связь Обсуждение "айтишных" вопросов и средств связи

Ответ
 
Опции темы Опции просмотра
Старый 31.08.2005, 09:08   #1
Заслуженный Участник
 
Аватар для dzher
 
Сообщений: 2,705
Благодарности: 1,165 в 612 сообщениях Поиск благодарностей dzher
По умолчанию sql флуд

дано:
таблички MASTER и MASTER_TEXT.
последняя содержит TITLE для MASTER в разных языках.

Код:
db2 => select * from master m, master_text t where t.master_oid =  m.oid

OID         CODE       OID         MASTER_OID  LANG       TTILE
----------- ---------- ----------- ----------- ---------- ---------------
          1 1                    1           1 en         english title
          1 1                    2           1 xyz       default title
          2 2                    3           2 cz         czek title
          3 3                    4           3 ch         china title
          3 3                    5           3 zh         zzzhina title
          4 4                    6           4 fr          french title
          4 4                    7           4 en         eng title 4
надоть:
сделать выборку типа етой - мастер.оид,мастер.коде,техт.тайтл ...
title м.б. _любой_ для данного мастера (первый попавшийся)

Код:
db2 => select * from master m, master_text t where t.oid = (select oid from master_text tt where tt.master_oid=m.oid  fetch first row only)

OID         CODE       OID         MASTER_OID  LANG       TTILE
----------- ---------- ----------- ----------- ---------- --------------------
          1 1                    1           1 en         english title
          2 2                    3           2 cz         czek title
          3 3                    4           3 ch         china title
          4 4                    6           4 fr         french title
так работает (db2), на Oracle/MSSQL тоже - там есть аналоги "FETCH FIRST" .
а вот cloudscape так не умеет - собсно задача - получить нужный резалт без использования FF/ROWNUM/etc
dzher вне форума   Ответить с цитированием

Зарегистрируйтесь или войдите под своим именем, чтобы спрятать этот рекламный блок
Старый 31.08.2005, 09:20   #2
Пенсионер всея Ирландея
 
Аватар для magician
 
Откуда: StormWind city
Сообщений: 15,195
Благодарности: 9,619 в 3,376 сообщениях Поиск благодарностей magician
По умолчанию Re: sql задачка

Код:
db2 => select * from master m, master_text t where t.oid IN (select oid from master_text tt where tt.master_oid=m.oid  and rownum <2)
?
__________________
невозможно испугать санкциями того, кому похер, так,что санкции против меня на этом форуме, мне феерически похер
magician вне форума   Ответить с цитированием
Старый 31.08.2005, 09:25   #3
Заслуженный Участник
 
Аватар для dzher
 
Сообщений: 2,705
Благодарности: 1,165 в 612 сообщениях Поиск благодарностей dzher
По умолчанию Re: sql задачка

Цитата:
Сообщение от magician
Код:
db2 => select * from master m, master_text t where t.oid [b]IN[/b] (select oid from master_text tt where tt.master_oid=m.oid  and [b]rownum[/b] <2)
?
не Маг, так не пойдет - rownum низзя
и IN низзя - каждому мастер нужно только _один_ тайтл (язык - любой)
dzher вне форума   Ответить с цитированием
Старый 31.08.2005, 09:28   #4
Пенсионер всея Ирландея
 
Аватар для magician
 
Откуда: StormWind city
Сообщений: 15,195
Благодарности: 9,619 в 3,376 сообщениях Поиск благодарностей magician
По умолчанию Re: sql задачка

Цитата:
Сообщение от dzher
не Маг, так не пойдет - rownum низзя
и IN низзя - каждому мастер нужно только _один_ тайтл (язык - любой)
а почему rownum то низзя ?
тогда если всетаки его можно ... то тока 1 и получится
даже в случае IN'a
__________________
невозможно испугать санкциями того, кому похер, так,что санкции против меня на этом форуме, мне феерически похер
magician вне форума   Ответить с цитированием
Старый 31.08.2005, 09:37   #5
Заслуженный Участник
 
Аватар для dzher
 
Сообщений: 2,705
Благодарности: 1,165 в 612 сообщениях Поиск благодарностей dzher
По умолчанию Re: sql задачка

Цитата:
Сообщение от magician
а почему rownum то низзя ?
дык нету его в cloudscape
надоть на каком SQL92(?) изловчится
dzher вне форума   Ответить с цитированием
Старый 31.08.2005, 09:39   #6
Активный Участник
 
Аватар для Valera
 
Сообщений: 345
Благодарности: 22 в 16 сообщениях Поиск благодарностей Valera
Отправить сообщение для  Valera с помощью ICQ
По умолчанию

можно искусственно, через груп бай... что-то типа:
Код:
select m.oid, max(t.title) from master m, master_text t where t.master_oid =  m.oid
group by m.oid
тока с агрегатными ф-циями нада поэксперементировать. я max просто так написал. можно че-то более разумное подобрать. ну и если надо "коде", то и его придется в групбай включить
Код:
select m.oid, m.code, max(t.title) from master m, master_text t where t.master_oid =  m.oid
group by m.oid, m.code
Valera вне форума   Ответить с цитированием
Старый 31.08.2005, 09:54   #7
My name is Exaybachay
 
Аватар для KaraNagai
 
Откуда: Дублин, Ирландия
Сообщений: 21,481
Благодарности: 12,152 в 4,948 сообщениях Поиск благодарностей KaraNagai
По умолчанию

> ну и если надо "коде", то и его придется в групбай включить

через груп-бай и макс не выйдет включить из второй таблицы два поля из одной и той же записи

а вложенные запросы c top там не работают? типа

Код:
select *, (select top 1 * from master_text where master_oid = master.oid)) from master
__________________
митьки никого не хотят победить
KaraNagai вне форума   Ответить с цитированием
Старый 31.08.2005, 09:59   #8
My name is Exaybachay
 
Аватар для KaraNagai
 
Откуда: Дублин, Ирландия
Сообщений: 21,481
Благодарности: 12,152 в 4,948 сообщениях Поиск благодарностей KaraNagai
По умолчанию

а вот еще бред воспаленного разума:

Код:
select m.*, mt1.* from master m inner join master_text mt1 on mt1.master_oid = m.oid 
							inner join master_text mt2 on mt2.master_oid = m.oid and mt2.oid > mt1.oid
group by mt2.oid
having min(mt2.oid) <= mt1.oid
правда я чтой-то в этом неуверен ;)
__________________
митьки никого не хотят победить
KaraNagai вне форума   Ответить с цитированием
Старый 31.08.2005, 10:19   #9
Активный Участник
 
Аватар для Valera
 
Сообщений: 345
Благодарности: 22 в 16 сообщениях Поиск благодарностей Valera
Отправить сообщение для  Valera с помощью ICQ
По умолчанию

с агрегатными ф-циями не некоторых случаях можно извратиться (e.g. max(lang+"че-нить"+title), а потом разделить

подзапросы в списке полей много где неработают
но если можно в where, то:
Код:
select * from master m, master_text t where t.master_oid =  m.oid
and t.oid = (select min(oid) from master_text tt where tt.master_oid =  m.oid)
если подзапросами там тоже нельзя, то вот это может:
Код:
select nt.oid, nt.code, nt.smthelse mt.* 
from master_text mt,
(select m.oid, m.code, m.smthelse, min(t.oid) from master m, master_text t where  t.master_oid =  m.oid
group by m.oid, m.code, m.smthelse) 
nt where mt.oid = nt.oid
[/code]
Valera вне форума   Ответить с цитированием
Старый 31.08.2005, 10:23   #10
Активный Участник
 
Аватар для Valera
 
Сообщений: 345
Благодарности: 22 в 16 сообщениях Поиск благодарностей Valera
Отправить сообщение для  Valera с помощью ICQ
По умолчанию

Цитата:
Сообщение от KaraNagai
Код:
select m.*, mt1.* from master m inner join master_text mt1 on mt1.master_oid = m.oid 
							inner join master_text mt2 on mt2.master_oid = m.oid and mt2.oid > mt1.oid
group by mt2.oid
having min(mt2.oid) <= mt1.oid
идею понял, но m.*, mt1.* не сработают их либо в груп-бай, либо под агр. ф-ции
Valera вне форума   Ответить с цитированием
Старый 31.08.2005, 10:49   #11
My name is Exaybachay
 
Аватар для KaraNagai
 
Откуда: Дублин, Ирландия
Сообщений: 21,481
Благодарности: 12,152 в 4,948 сообщениях Поиск благодарностей KaraNagai
По умолчанию

> с агрегатными ф-циями не некоторых случаях можно извратиться (e.g.
> max(lang+"че-нить"+title), а потом раздели

а ну точно да ;)

> идею понял, но m.*, mt1.* не сработаютWink их либо в груп-бай, либо
> под агр. ф-цииWink

а ну разумеется, я дурак, группировать-то надо по ним. ну тем не менее
__________________
митьки никого не хотят победить
KaraNagai вне форума   Ответить с цитированием
Старый 31.08.2005, 11:59   #12
Заслуженный Участник
 
Аватар для dzher
 
Сообщений: 2,705
Благодарности: 1,165 в 612 сообщениях Поиск благодарностей dzher
По умолчанию

о! заработала
Код:
select m.oid,m.code,t.lang,t.title from lwplms.master m, lwplms.master_text t, 
  (select master_oid,substr(MX,2) as oid
    from (select master_oid,max(N) as MX
      from (select master_oid,lang, 
		case
		  when lang='fr' then 'Z'||oid 
		  when lang='en' then 'Y'||oid
		  else 'X'||oid 
		end as N 
        from lwplms.master_text 
      ) A group by master_oid
    ) B 
  ) C where m.oid=c.master_oid and t.oid=c.oid
спасиба за идею с агр.функциями...
тут такой задача был - выбрать TITLE для preferedLang (fr в нашем случае), если такого нет - берем english, если и того нет - хватаем любой для данного MASTER ...

ща бум "причесывать" .
dzher вне форума   Ответить с цитированием
Старый 31.08.2005, 12:25   #13
My name is Exaybachay
 
Аватар для KaraNagai
 
Откуда: Дублин, Ирландия
Сообщений: 21,481
Благодарности: 12,152 в 4,948 сообщениях Поиск благодарностей KaraNagai
По умолчанию

я всегда утверждал, что сиквел - долгоиграющий ублюдок индустрии. ни красоты, ни читабельности, и на каждом шагу требуется изъ... ну короче применить чрезмерно сложное решения для простой проблемы, потому что простого решения не существует ;)
__________________
митьки никого не хотят победить
KaraNagai вне форума   Ответить с цитированием

Зарегистрируйтесь или войдите под своим именем, чтобы спрятать этот рекламный блок
Старый 31.08.2005, 13:47   #14
Заслуженный Участник
 
Аватар для Arte
 
Откуда: Planet Earth
Сообщений: 3,287
Благодарности: 1,368 в 554 сообщениях Поиск благодарностей Arte
Отправить сообщение для  Arte с помощью ICQ
По умолчанию

Цитата:
Сообщение от KaraNagai
я всегда утверждал, что сиквел - долгоиграющий ублюдок индустрии. ни красоты, ни читабельности, и на каждом шагу требуется изъ... ну короче применить чрезмерно сложное решения для простой проблемы, потому что простого решения не существует
Эээ дорогой, критиковать всегда легко, а ты лучше предложи что-то толковое 8)
Arte вне форума   Ответить с цитированием
Старый 31.08.2005, 13:51   #15
My name is Exaybachay
 
Аватар для KaraNagai
 
Откуда: Дублин, Ирландия
Сообщений: 21,481
Благодарности: 12,152 в 4,948 сообщениях Поиск благодарностей KaraNagai
По умолчанию

> а ты лучше предложи что-то толковое

да предложить - не проблема. проблема в том что все на этот сиквел в той или иной реализации подсажены как на героин. и любое предложение канет в лету вместе с усилиями по его реализации. проще выражаясь не окупится.
__________________
митьки никого не хотят победить
KaraNagai вне форума   Ответить с цитированием
Ответ



Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать на сообщения
Вы не можете добавлять вложения
Вы не можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT, времени сейчас: 17:07.


vBulletin®, Copyright ©2000-2025, Jelsoft Enterprises Ltd., Русификация: zCarot, Vovan & Co
©2003-2025 VirtualIreland.ru - Виртуальная Ирландия