Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
6-1088425968
castanye
2004-06-28 16:32
2004.08.29
Устнавить статус соединения по локальной сети !


14-1092119952
Lizka
2004-08-10 10:39
2004.08.29
сервис паки


1-1092308148
Zlodey
2004-08-12 14:55
2004.08.29
qtintf70.dll


6-1086003426
Maxuz
2004-05-31 15:37
2004.08.29
TClientSocket


1-1092226114
TEXHAPb
2004-08-11 16:08
2004.08.29
Простой вопрос: C -> Pascal





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский