Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

SQL [D3, MSSQL]


Страницы:   1 2

Trofimov ©   (2004-08-05 11:21:00) 

Привет! Есть таблица "Рейсы"(кое какие поля: город отправления, город прибытия). Эти поля связаны с таблицей городов. Как
сделать запрос чтобы вывелась таблица рейсов и в ней из таблицы Города попали названия соответствующие поля таблицы Рейсы?
Спасиб


Trofimov   (2004-08-05 13:56:00) [1]

Ну что все заснули что ли?
Пока я пришел к выводу:
через внутреннее соединение (join и т.п.) можно соединить две таблицы по полям ( однополе главной с ОДНИМполем подчиненной) Trofimov Danilka © ОДНА таблица TOWN а не 2 так что пост 12 - негодиться Sandman25 © [35] Trofimov   (05.08.04 14:06)

а как Вы думаете, в посте [3] одна таблица town или две? Danilka © [35] Trofimov   (05.08.04 14:06)
Тихий ужас. :))
Ладно, специально для тебя выделю там две таблицы городов:

Select t1.TownName as TownIn, t2.TownName as TownOut
from Trips tr
inner join townst1 on t1.TownID=tr.TownIDIn
inner join Townst2 on t2.TownID=tr.TownIDOut

скажи, дорогой друг, сколько слов выделено жирными буковками? Trofimov Danilka ©   не я теперь врубился - таблица одна но у нее два имени и поэтому это все-таки надо испытать... через 5 мин скажу как это прокатит Trofimov (1 вариант)
select
 claim.inc,
 "order".claim,
 freight.lname,
 source = (Select town.lname from town where town.inc = freight.source),
 target = (Select town.lname from town where town.inc = freight.target)
from
 claim,
 "order",
 freight

where
 claim.inc="order".claim
 and
 "order".freight=freight.inc

(2 вариант)
select
 claim.inc,
 "order".claim,
 freight.lname,
 ta.lname,
 tb.lname
from
 claim,
 "order",  
 freight
inner join
  town ta on ta.inc=freight.source
inner join
  town tb on tb.inc=freight.target
where
 claim.inc="order".claim
 and
 "order".freight=freight.inc Trofimov Теперь такой вопрос: что лучше и почему? (вопрос ко всем)
Про execution plan MS SQL мне рассказывать не нужно Sandman25 © 3 вариант

select
claim.inc,
"order".claim,
freight.lname,
ta.lname,
tb.lname
from
claim,
"order",  
freight,
 town ta,  
 town tb
where ta.inc=freight.source
 and tb.inc=freight.target
 and claim.inc="order".claim
 and "order".freight=freight.inc Sandman25 © >Теперь такой вопрос: что лучше и почему? (вопрос ко всем)

Вопрос не имеет смыла - запросы не эквивалентны :)
Для эквивалентности придется воспользоваться Outer join Sandman25 © select
claim.inc,

(select "order".claim from "order" where claim.inc="order".claim),

(select freight.lname from freight where freight.inc =(select "order".freight from "order" where claim.inc="order".claim)),

source = (Select town.lname from town where town.inc =
(select freight.source from freight where freight.inc =(select "order".freight from "order" where claim.inc="order".claim))),

target = (Select town.lname from town where town.inc =
(select freight.target from freight where freight.inc =(select "order".freight from "order" where claim.inc="order".claim)))

from
claim

Надеюсь, после просмотра этого select станет очевидно, что не стоит пользоваться вложенными select, если можно воспользоваться join :) Trofimov Ну 3 вариант я согласен пока что лучший, но что ж мне все голову трепали про внутреннее соединение когда можно было так сделать? Trofimov мой вывод - внешнее соединение наиболее оптимально Johnmen © Потому, что внутреннее соединение (JOIN) = 3 варианту.
Но с JOIN читабельней. Danilka © [46] Johnmen ©   (05.08.04 14:42)
Кому как, я больше к 3 варианту привык, для меня он читабельней. :) Trofimov Ну а работает что быстрее join или where Trofimov разве связка по типу join не будет работать гораздо быстрее связки по типу where... ? На скорость доступа к результирующему НД это не повлияет, но сам запрос будет выполняться быстрее. По крайней мере, в парадоксе или IB это так (при прочих равных условиях). Johnmen © >Ну а работает что быстрее join или where

2 = 2
Что больше 2 или 2 ?
:)
Есть, правда, ещё такая вещь, как парсер и оптимизатор запросов. У них можно спросить. У правильных - одинаково. Trofimov Ну а тогда какой смысл создавать было JOIN если они с WHERE аналогично работать будут? Johnmen © Аналогично только в данном конкретном случае.
И джоин он разный, понимаешь, бывает... Trofimov Ты имеешь ввиду inner left right natural cross и т.п? Trofimov Тогда я согласен. Вообщем сегодня свой вопрос я окончательно решил. Всем большое спасибо.


Danilka   (2004-08-05 13:55:00) [2]

2 Trofimov

Мда.
Ты вот этот пост: [12] Плохиш ©   (05.08.04 11:49)
смотрел или нет? Или посмотрел, но ничего не понял? Там все расписано.


Trofimov   (2004-08-05 12:58:00) [3]

Ну вот так получилось пока
SELECT
freight.source,
freight.target,    
town.lname
FROM freight inner JOIN town on freight.source=town.inc
но как сюда привязать еще одно свзаное поле таблицы "Рейсы"?


Trofimov   (2004-08-05 12:54:00) [4]

Sandman25 ©   ну а оптимальность нам покажет SQL Query Analyser в Execution Plan ...


Sandman25   (2004-08-05 12:46:00) [5]

оригинальность не самый лучший критерий оптимальности запросов


Trofimov   (2004-08-05 12:39:00) [6]

я все ж - таки решил написать альтернативный запрос к базе.
Советую и вам попробовать а потом сравним оригинальность!


Trofimov   (2004-08-05 12:14:00) [7]

PS. "Накласть на всех" -  это просто образное выражение, и я не собираюсь ни на кого класть!


Rule   (2004-08-05 12:11:00) [8]

Trofimov   (05.08.04 12:03) [23]
Действительно хоть это и можно отнести к разряду шутки но прям класть на друггих не надо ... могут в игнор отправить и тогда все вопросы будут в воздух


Trofimov   (2004-08-05 12:11:00) [9]

TDK прочитай весь форум! Когда тебе нужен совет а тут кто то про пивко рассуждает спокойненько
то начинаешь беситься!
ВСЕ. Всем спасибо дискуссия окончена!


Johnmen   (2004-08-05 12:10:00) [10]

Прикольно...
А я могу написать ещё более громоздко и тормознуто...:)
>Trofimov
Может фишка именно в этом ? Или в юзанье нестандартных возможностей ?


TDK   (2004-08-05 12:08:00) [11]

>Ну мне накласть кто кому чего должен !!!
С таким отношением, в следующий раз, всем тоже будет "накласть" какая там у тебя проблема!


Trofimov   (2004-08-05 12:03:00) [12]

Ну мне накласть кто кому чего должен !!!
Запгос тгебует нагод! Хлеба и зрелищ!


Danilka   (2004-08-05 11:58:00) [13]

[20] Плохиш ©   (05.08.04 11:55)
гы-гы-гы :))

[19] Trofimov   (05.08.04 11:55)
не тем местом смотришь, смотри сюда: [12] Плохиш ©   (05.08.04 11:49)


Плохиш   (2004-08-05 11:58:00) [14]


> Trofimov   (05.08.04 11:55) [19]
> Если я отправлю ящик пива то мне должны отправить этот запрос

Ээээ, товагищ, вы вообще ответы-то читаете?


Плохиш   (2004-08-05 11:55:00) [15]


> Danilka ©   (05.08.04 11:52) [17]
> Дык, я свой ящик ставил, против его всего одной бутылочки,
> но что-то отмолчался. :))

О, блин, ну пусть хоть бутылку шлёт :-)


Плохиш   (2004-08-05 11:55:00) [16]

PS. Не по-юзаную ;-)


Trofimov   (2004-08-05 11:55:00) [17]

Если я отправлю ящик пива то мне должны отправить этот запрос а
пока я составил запрос вида
select
 claim.inc,
 "order".claim,
 freight.lname,
 source = (Select town.lname from town where town.inc = freight.source),
 target = (Select town.lname from town where town.inc = freight.target)
from
 claim,
 "order",
 freight

where
 claim.inc="order".claim
 and
 "order".freight=freight.inc


Danilka   (2004-08-05 11:52:00) [18]

[12] Плохиш ©   (05.08.04 11:49)
> PPS. Отправляй яшик пива Danilk-е :-)

Дык, я свой ящик ставил, против его всего одной бутылочки, но что-то отмолчался. :))


Плохиш   (2004-08-05 11:52:00) [19]


> Trofimov   (05.08.04 11:50) [14]
> Danilka © я джоинами много юзал

Ой, а мы так верим, так верим


Плохиш   (2004-08-05 11:50:00) [20]


> Danilka ©   (05.08.04 11:46) [11]

Не забуть рассазать, прислал-ли он тебе ящик пива ;-)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо