Форум: "Базы";
Текущий архив: 2004.08.29;
Скачать: [xml.tar.bz2];
ВнизSQL Найти похожие ветки
← →
Trofimov (2004-08-05 11:21) [0]Привет! Есть таблица "Рейсы"(кое какие поля: город отправления, город прибытия). Эти поля связаны с таблицей городов. Как
сделать запрос чтобы вывелась таблица рейсов и в ней из таблицы Города попали названия соответствующие поля таблицы Рейсы?
Спасиб
← →
Johnmen © (2004-08-05 11:23) [1]см.
[INNER] JOIN | {LEFT | RIGHT | FULL } [OUTER]} JOIN
← →
Trofimov (2004-08-05 11:26) [2]Johnmen © , такая вещь думаешь поможет? Сейчас посмотрю но думаю вряд ли........
← →
Ega23 © (2004-08-05 11:26) [3]
Select TownIn=(Select TownName from Towns where TownID=TownIDIn),
TownOut=(Select TownName from Towns where TownID=TownIDOut)
from Trips
← →
Johnmen © (2004-08-05 11:32) [4]>Trofimov (05.08.04 11:26) [2]
Интересно, а для чего по-твоему "такая вещь" ?
← →
Trofimov (2004-08-05 11:33) [5]Ega23 © , вроде это то что нады. Запрос вышел как надо. Спасибо, я например не знал что так хитро можно сделать в запросе
← →
Trofimov (2004-08-05 11:34) [6]Johnmen © ну в этой ситуации это точно не прокатит
← →
Sandman25 © (2004-08-05 11:35) [7][5] Trofimov (05.08.04 11:33)
Можно и без этих хитростей, обычным inner join.
← →
Плохиш © (2004-08-05 11:35) [8]>Trofimov (05.08.04 11:34) [6]
Как много ты ещё чего не знаешь!
← →
Danilka © (2004-08-05 11:36) [9][6] Trofimov (05.08.04 11:34)
да ну? ставлю ящик пива против твоей одной бутылки, по-рукам? :))
← →
Trofimov (2004-08-05 11:43) [10]Если все такие "умные" то покажите как можно с помощью inner join...
← →
Danilka © (2004-08-05 11:46) [11][10] Trofimov (05.08.04 11:43)
Угу. Ты-бы еще попросил показать, как ходить ногами. Джойны именно для и придуманы, что ты просишь, а примеры подробные и в хелпе есть, но начать лучше с книжек умных, однако. :))
← →
Плохиш © (2004-08-05 11:49) [12]
> Trofimov (05.08.04 11:43) [10]
> Если все такие "умные" то покажите как можно с помощью inner
> join...
Select t1.TownName as TownIn, t2.TownName as TownOut
from Trips tr
inner join towns t1 on t1.TownID=tr.TownIDIn
inner join Towns t2 on t2.TownID=tr.TownIDOut
PS. Ешё и проверку произведёт на правильность данных в Trips
PPS. Отправляй яшик пива Danilk-е :-)
← →
Rule © (2004-08-05 11:49) [13]Trofimov (05.08.04 11:34) [6]
Советую более внимательно почитать про Join вообщето как раз для ваших ситуаций оно и придумано, и кстати взамозаменямо с Where шас продемонстрирую:
select a.reisid, b.name, b.name from raises a, towns b where
a.townin=b.id and a.townout=b.id
я надеюсь понятно где какие поля
reisid - номер рейса в таблице рейсов
name - название города в таблице городов
id - первичный ключ города
townin - город прибытия
townout - город отбытия
← →
Trofimov (2004-08-05 11:50) [14]Danilka © я джоинами много юзал но тут такая дребедень что надо связать два поля причем эти поля лежат в одной родительской таблице! Ega23 все верно указал и вообще я запрос уже сделал!
Заканчиваем спор и без примера ты меня все равно не переубедишь а самому мне влом уже переделывать запрос!!!
← →
Плохиш © (2004-08-05 11:50) [15]
> Danilka © (05.08.04 11:46) [11]
Не забуть рассазать, прислал-ли он тебе ящик пива ;-)
← →
Плохиш © (2004-08-05 11:52) [16]
> Trofimov (05.08.04 11:50) [14]
> Danilka © я джоинами много юзал
Ой, а мы так верим, так верим
← →
Danilka © (2004-08-05 11:52) [17][12] Плохиш © (05.08.04 11:49)
> PPS. Отправляй яшик пива Danilk-е :-)
Дык, я свой ящик ставил, против его всего одной бутылочки, но что-то отмолчался. :))
← →
Плохиш © (2004-08-05 11:55) [18]
> Danilka © (05.08.04 11:52) [17]
> Дык, я свой ящик ставил, против его всего одной бутылочки,
> но что-то отмолчался. :))
О, блин, ну пусть хоть бутылку шлёт :-)
← →
Trofimov (2004-08-05 11:55) [19]Если я отправлю ящик пива то мне должны отправить этот запрос а
пока я составил запрос вида
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
← →
Плохиш © (2004-08-05 11:55) [20]PS. Не по-юзаную ;-)
← →
Плохиш © (2004-08-05 11:58) [21]
> Trofimov (05.08.04 11:55) [19]
> Если я отправлю ящик пива то мне должны отправить этот запрос
Ээээ, товагищ, вы вообще ответы-то читаете?
← →
Danilka © (2004-08-05 11:58) [22][20] Плохиш © (05.08.04 11:55)
гы-гы-гы :))
[19] Trofimov (05.08.04 11:55)
не тем местом смотришь, смотри сюда: [12] Плохиш © (05.08.04 11:49)
← →
Trofimov (2004-08-05 12:03) [23]Ну мне накласть кто кому чего должен !!!
Запгос тгебует нагод! Хлеба и зрелищ!
← →
TDK (2004-08-05 12:08) [24]>Ну мне накласть кто кому чего должен !!!
С таким отношением, в следующий раз, всем тоже будет "накласть" какая там у тебя проблема!
← →
Johnmen © (2004-08-05 12:10) [25]Прикольно...
А я могу написать ещё более громоздко и тормознуто...:)
>Trofimov
Может фишка именно в этом ? Или в юзанье нестандартных возможностей ?
← →
Trofimov (2004-08-05 12:11) [26]TDK прочитай весь форум! Когда тебе нужен совет а тут кто то про пивко рассуждает спокойненько
то начинаешь беситься!
ВСЕ. Всем спасибо дискуссия окончена!
← →
Rule © (2004-08-05 12:11) [27]Trofimov (05.08.04 12:03) [23]
Действительно хоть это и можно отнести к разряду шутки но прям класть на друггих не надо ... могут в игнор отправить и тогда все вопросы будут в воздух
← →
Trofimov (2004-08-05 12:14) [28]PS. "Накласть на всех" - это просто образное выражение, и я не собираюсь ни на кого класть!
← →
Trofimov (2004-08-05 12:39) [29]я все ж - таки решил написать альтернативный запрос к базе.
Советую и вам попробовать а потом сравним оригинальность!
← →
Sandman25 © (2004-08-05 12:46) [30]оригинальность не самый лучший критерий оптимальности запросов
← →
Trofimov (2004-08-05 12:54) [31]Sandman25 © ну а оптимальность нам покажет SQL Query Analyser в Execution Plan ...
← →
Trofimov (2004-08-05 12:58) [32]Ну вот так получилось пока
SELECT
freight.source,
freight.target,
town.lname
FROM freight inner JOIN town on freight.source=town.inc
но как сюда привязать еще одно свзаное поле таблицы "Рейсы"?
← →
Danilka © (2004-08-05 13:55) [33]2 Trofimov
Мда.
Ты вот этот пост: [12] Плохиш © (05.08.04 11:49)
смотрел или нет? Или посмотрел, но ничего не понял? Там все расписано.
← →
Trofimov (2004-08-05 13:56) [34]Ну что все заснули что ли?
Пока я пришел к выводу:
через внутреннее соединение (join и т.п.) можно соединить две таблицы по полям ( одно поле главной с ОДНИМ полем подчиненной)
← →
Trofimov (2004-08-05 14:06) [35]Danilka © ОДНА таблица TOWN а не 2 так что пост 12 - негодиться
← →
Sandman25 © (2004-08-05 14:08) [36][35] Trofimov (05.08.04 14:06)
а как Вы думаете, в посте [3] одна таблица town или две?
← →
Danilka © (2004-08-05 14:08) [37][35] Trofimov (05.08.04 14:06)
Тихий ужас. :))
Ладно, специально для тебя выделю там две таблицы городов:
Select t1.TownName as TownIn, t2.TownName as TownOut
from Trips tr
inner join towns t1 on t1.TownID=tr.TownIDIn
inner join Towns t2 on t2.TownID=tr.TownIDOut
скажи, дорогой друг, сколько слов выделено жирными буковками?
← →
Trofimov (2004-08-05 14:14) [38]Danilka © не я теперь врубился - таблица одна но у нее два имени и поэтому это все-таки надо испытать... через 5 мин скажу как это прокатит
← →
Trofimov (2004-08-05 14:30) [39](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 (2004-08-05 14:31) [40]Теперь такой вопрос: что лучше и почему? (вопрос ко всем)
Про execution plan MS SQL мне рассказывать не нужно
← →
Sandman25 © (2004-08-05 14:32) [41]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 © (2004-08-05 14:33) [42]>Теперь такой вопрос: что лучше и почему? (вопрос ко всем)
Вопрос не имеет смыла - запросы не эквивалентны :)
Для эквивалентности придется воспользоваться Outer join
← →
Sandman25 © (2004-08-05 14:37) [43]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 (2004-08-05 14:38) [44]Ну 3 вариант я согласен пока что лучший, но что ж мне все голову трепали про внутреннее соединение когда можно было так сделать?
← →
Trofimov (2004-08-05 14:40) [45]мой вывод - внешнее соединение наиболее оптимально
← →
Johnmen © (2004-08-05 14:42) [46]Потому, что внутреннее соединение (JOIN) = 3 варианту.
Но с JOIN читабельней.
← →
Danilka © (2004-08-05 14:46) [47][46] Johnmen © (05.08.04 14:42)
Кому как, я больше к 3 варианту привык, для меня он читабельней. :)
← →
Trofimov (2004-08-05 15:43) [48]Ну а работает что быстрее join или where
← →
Trofimov (2004-08-05 16:27) [49]разве связка по типу join не будет работать гораздо быстрее связки по типу where... ? На скорость доступа к результирующему НД это не повлияет, но сам запрос будет выполняться быстрее. По крайней мере, в парадоксе или IB это так (при прочих равных условиях).
← →
Johnmen © (2004-08-05 16:33) [50]>Ну а работает что быстрее join или where
2 = 2
Что больше 2 или 2 ?
:)
Есть, правда, ещё такая вещь, как парсер и оптимизатор запросов. У них можно спросить. У правильных - одинаково.
← →
Trofimov (2004-08-05 17:01) [51]Ну а тогда какой смысл создавать было JOIN если они с WHERE аналогично работать будут?
← →
Johnmen © (2004-08-05 17:07) [52]Аналогично только в данном конкретном случае.
И джоин он разный, понимаешь, бывает...
← →
Trofimov (2004-08-05 17:11) [53]Ты имеешь ввиду inner left right natural cross и т.п?
← →
Trofimov (2004-08-05 17:13) [54]Тогда я согласен. Вообщем сегодня свой вопрос я окончательно решил. Всем большое спасибо.
Страницы: 1 2 вся ветка
Форум: "Базы";
Текущий архив: 2004.08.29;
Скачать: [xml.tar.bz2];
Память: 0.57 MB
Время: 0.038 c