русский
Germany.ruForen → Архив Досок→ Programmierung

SQL

715  1 2 alle
voxel3d патриот26.05.11 14:03
voxel3d
NEW 26.05.11 14:03 
Zuletzt geändert 26.05.11 14:04 (voxel3d)
Не могу понять, как запрос работает (он работает), вот секция FROM:
FROM
((Materiaal_T
INNER JOIN (Leveranciers_T
INNER JOIN (Handvat_T
INNER JOIN (OPDRUKBONS_T
LEFT JOIN Klantenadressen_T
ON OPDRUKBONS_T.Klantnummer=Klantenadressen_T.KlantNr)
ON Handvat_T.IDnr=OPDRUKBONS_T.Handvat)
ON Leveranciers_T.IDnr=OPDRUKBONS_T.Leverancier)
ON Materiaal_T.IDnr=OPDRUKBONS_T.Materiaal)
LEFT JOIN KLACHTEN_T
ON OPDRUKBONS_T.KooporderNr=KLACHTEN_T.KooporderNr)


не могу перевести это в привычный линейный вид, когда идёт джойн - условие джойн - условие, без этих вложенностей. Как преобразовать этот запрос?

Dropbox - средство синхронизации и бэкапа файлов.
#1 
voxel3d патриот26.05.11 14:25
voxel3d
NEW 26.05.11 14:25 
in Antwort voxel3d 26.05.11 14:03
Разобрался, как переделать:
FROM
OPDRUKBONS_T LEFT JOIN Klantenadressen_T
ON OPDRUKBONS_T.Klantnummer=Klantenadressen_T.KlantNr
JOIN Leveranciers_T
ON Leveranciers_T.IDnr=OPDRUKBONS_T.Leverancier
JOIN Handvat_T
ON Handvat_T.IDnr=OPDRUKBONS_T.Handvat
JOIN Materiaal_T
ON Materiaal_T.IDnr=OPDRUKBONS_T.Materiaal
LEFT JOIN KLACHTEN_T
ON OPDRUKBONS_T.KooporderNr=KLACHTEN_T.KooporderNr


только почему так оно раскрывается, я не понял.

Dropbox - средство синхронизации и бэкапа файлов.
#2 
GANDJUBAS Ганджубас26.05.11 20:51
GANDJUBAS
NEW 26.05.11 20:51 
in Antwort voxel3d 26.05.11 14:25
Есть подозрение, что оптимизатор в нормальной ДБ делает в итоге из обоих запросов одно и то же.
В ответ на:
только почему так оно раскрывается, я не понял.

Первый вариант (A + (B + (C + D))) + E
Твой вариант A + B + C + D + E
#3 
  digital.pilot патриот26.05.11 22:50
digital.pilot
NEW 26.05.11 22:50 
in Antwort voxel3d 26.05.11 14:25
операция иннер джойна ассоциативна.
Лефт аутер в кол-ве 1 штуки тоже не помеха, т.к. без разницы, когда цеплять правую таблицу - до иннер джойнов левой со всеми остальными или после.
#4 
voxel3d патриот27.05.11 00:58
voxel3d
NEW 27.05.11 00:58 
in Antwort GANDJUBAS 26.05.11 20:51
В ответ на:

Есть подозрение, что оптимизатор в нормальной ДБ делает в итоге из обоих запросов одно и то же.

Ну да. В данном случае работа с MSSQL.
В ответ на:
Первый вариант (A + (B + (C + D))) + E
Твой вариант A + B + C + D + E

Не совсем так.
Если первый вариант: A join (B join (C join (D left join E))) left join F
второй: D left join E join B join C join A left join F.
В ответ на:
операция иннер джойна ассоциативна.
Лефт аутер в кол-ве 1 штуки тоже не помеха, т.к. без разницы, когда цеплять правую таблицу - до иннер джойнов левой со всеми остальными или после.

Как полностью правило преобразования сформулировать?
Dropbox - средство синхронизации и бэкапа файлов.
#5 
  digital.pilot патриот27.05.11 03:27
digital.pilot
NEW 27.05.11 03:27 
in Antwort voxel3d 27.05.11 00:58
В ответ на:
Как полностью правило преобразования сформулировать?

порядок вычисления иннеров можно менять произвольно, порядок лефт аутеров на общей левой таблице тоже можно менять произвольно, порядок вычисления лефт аутеров на разных левых частях менять нельзя. Как-то так.
#6 
Murr патриот27.05.11 21:40
Murr
NEW 27.05.11 21:40 
in Antwort voxel3d 27.05.11 00:58
Как полностью правило преобразования сформулировать?
------
Почти никак.
Конкретное построение будет базироваться не только на синтаксисе, но и на статистике.
Так что левый джойн может быть отдельным сканом, а может и вообще не сканится...
Я почти перестал смотреть как оно джойнится - накидал во вью что надо, сцепил как
подходит - с остальным, пока запрос не выпадет за пару минут, вообще не вожусь....
ЗЫ. У тебя что, как у меня - база грязная с нулами и без реляций? Зачем еще левый
джойн нужен?
#7 
voxel3d патриот27.05.11 21:58
voxel3d
NEW 27.05.11 21:58 
in Antwort Murr 27.05.11 21:40, Zuletzt geändert 27.05.11 21:59 (voxel3d)
В ответ на:
У тебя что, как у меня - база грязная с нулами и без реляций?

Да. Только я уже закончил с этим проектом. Поправил запрошенные баги и сдал. Там из аксесса базу в проект притащили - полный пи###ц. Десятки полей в таблицах, километровые запросы...
Dropbox - средство синхронизации и бэкапа файлов.
#8 
  digital.pilot патриот27.05.11 22:10
digital.pilot
NEW 27.05.11 22:10 
in Antwort Murr 27.05.11 21:40, Zuletzt geändert 27.05.11 22:11 (digital.pilot)
В ответ на:
Зачем еще левый
джойн нужен?

он и в нормальных базах нередко нужен. Для вывода бездетных строк вместе со всеми. Особенно в репортинге.
#9 
Murr патриот27.05.11 23:31
Murr
27.05.11 23:31 
in Antwort voxel3d 27.05.11 21:58
из аксесса базу в проект притащили - полный пи###ц
-------
Это еще не писсец... Писсец - это у меня сейчас...
База... живет - непонятно сколько... но - в многопользовательской системе...
В смысле - не многоюзерской, а много раздельных лицензированных пользователей,
каждый со своими данными...
База - без реляций... Таблицы - без ключей... Поля - практически все с нуллами...
Сложных запросов, как таковых, практически нету... есть выборки из таблиц...
динамическим скл-ом... при этом откуда именно и что берется непонятно -
имена таблиц в запросах левые, пересчитываются vbscript'ом...
До недавнего времени требовали править код по живой системе... через месяц
дошло, что еще немного и задачу они просто не соберут...
АСПшный код... полный звизденец... управление страницей выполняется не через
операции на странице, а через загрузку файлов... что намешано в файлах - мрак...
Одних определений коннектов к базе - штук 20-ть... не считая прописанных прямо
на странице...
Сегодня с одной страницы снес с полтора десятка включаемых файлов... и пяток
ссылок на жабий скрипт... пофиг - все пашет как и было...

Частично используется жабий скрипт... Это отдельная песТня.... Часто используется
загрузка и показ немодальной формы со стороннего АСП... Есть функция чтобы ее
загрузить и показать... точнее - несколько имплементаций одной и той же функции...
Сегодня задал поиск - штук 40 вариантов на трех сайтах...
Но это еще не все... вместо передачи параметров - в теле скрипта определяются
переменные... поменять на передачу параметров - нельзя... слишком много работы...
Днями надо было добавить "переменную-параметр"... добавил, проверил... свое...
все работает...
Вчера показывают - вот, поправили все другие страницы - на каждую вставили твою
"переменную-параметр"... потому как по другому не работало... - Но она там нафиг
не нужна - она нужна только на той группе которой Я занимался... - Ничего - мы ее
потом используем для другого параметра... :) - объясняю - не надо так делать -
сделайте одну переменную куда можно сложить что надо или оставить ее пустой
- в процедуре больше править ничего не надо будет... --- Сделали... переименовали
переменную, присвоили ноль... в функции - аккуратно собрали с строку с остальными...
И ничего - пишут код и даже что-то работает... Но вообще - мрачно... пиззенец...
#10 
Murr патриот27.05.11 23:40
Murr
NEW 27.05.11 23:40 
in Antwort digital.pilot 27.05.11 22:10
Для вывода бездетных строк вместе со всеми. Особенно в репортинге.
------
Можно обойтись и без... вообще без джойна... В репортинге - сложнее,
но тоже можно...
#11 
Simple Nothing is f*cked29.05.11 11:01
Simple
NEW 29.05.11 11:01 
in Antwort voxel3d 27.05.11 21:58
И че, мигрировать пришлось?
Наша база тоже в полной жопе, но исправлять боятся.
#12 
voxel3d патриот29.05.11 11:08
voxel3d
NEW 29.05.11 11:08 
in Antwort Simple 29.05.11 11:01
Они перетащили аксессовую базу в мсскл, не знаю, как они перетаскивали, я сдал проект и x. с ним - неинтересно всё, что связанно с ASP.Net & MSSQL SERVER.
Dropbox - средство синхронизации и бэкапа файлов.
#13 
Simple Nothing is f*cked29.05.11 11:26
Simple
NEW 29.05.11 11:26 
in Antwort voxel3d 29.05.11 11:08
Везет. Вот бросить бы все и махнуть в задрючинск (с) :-D
#14 
  scorpi_ прохожий01.06.11 20:06
NEW 01.06.11 20:06 
in Antwort voxel3d 26.05.11 14:25
С опозданием, но может будет полезно.
0. Есть такая замечательная книжица Inside Microsoft® SQL Server® 2008: T-SQL Programming, в ней подробно изложено, как обрабатываются запросы.
1. При обработке запроса сначала идут кроссы, потом джойны, потом добавление значений для OUTER джойнов.
2. Порядок джойнов определяется порядком ON
3. Смотрим на твои ONы, в ссответствии со скобками:
FROM
(
(
Materiaal_T INNER JOIN
(
Leveranciers_T INNER JOIN
(
Handvat_T INNER JOIN
(
OPDRUKBONS_T LEFT JOIN Klantenadressen_T ON OPDRUKBONS_T.Klantnummer=Klantenadressen_T.KlantNr -- 1
)
ON Handvat_T.IDnr=OPDRUKBONS_T.Handvat -- 2
)
ON Leveranciers_T.IDnr=OPDRUKBONS_T.Leverancier -- 3
)
ON Materiaal_T.IDnr=OPDRUKBONS_T.Materiaal -- 4
)
LEFT JOIN KLACHTEN_T ON OPDRUKBONS_T.KooporderNr=KLACHTEN_T.KooporderNr -- 4
)

4. Получаем:

FROM OPDRUKBONS_T
LEFT JOIN Klantenadressen_T ON OPDRUKBONS_T.Klantnummer = Klantenadressen_T.KlantNr
INNER JOIN Handvat_T ON OPDRUKBONS_T.Handvat = Handvat_T.IDnr
INNER JOIN Leveranciers_T OPDRUKBONS_T.Leverancier = Leveranciers_T.IDnr
INNER JOIN Materiaal_T ON OPDRUKBONS_T.Materiaal = Materiaal_T.IDnr
LEFT JOIN KLACHTEN_T ON OPDRUKBONS_T.KooporderNr = KLACHTEN_T.KooporderNr

5. Но, как правильно заметил дигитальный, порядок иннеров вообще не важен, а при левом джойне берутся все записи из левой таблицы и затем идет добавка нулей для несуществующих правых значений. То бишь в нашем случае порядок левых тоже неважен. И поэтому написав FROM OPDRUKBONS_T мы можем остальные 5 джойнов записывать в абсолютно любом порядке.
6. За скобки я в детстве убивал из рогатки.

#15 
Murr патриот01.06.11 21:45
Murr
NEW 01.06.11 21:45 
in Antwort scorpi_ 01.06.11 20:06
НП.
В СКЛную тему.
Сегодня споткнулся об задачку.
ДАНО:
Мелкософтовский сиквел, 2005 или 2008...
Дурная самоджойнутая таблица-дерево.
Требуется сделать выборку двух уровней дерева.
Результат упорядочить по значению в поле, но в пределах подветви...
Делаю по простому - селект из юниона - все по букварю...
SELECT * FROM
(
SELECT S1.*, 1 as FLAG FROM TBL S1 WHERE <условия головной части>
UNION
SELECT S2.*, 2 as FLAG FROM TBL S2 WHERE <условия субветвей>
)
ORDER BY FLAG, <поле>
И это... пипец... не работает... при том, что по частям все работает...
Ругается на ошибку в районе ORDER BY...
Наверное надо будет скастить FLAG к чему-нибудь... или добавить
алиас к выборке...

#16 
  digital.pilot патриот01.06.11 21:50
digital.pilot
NEW 01.06.11 21:50 
in Antwort Murr 01.06.11 21:45
он на внешний селект ругается. Зачем он, кстати?
#17 
Murr патриот01.06.11 22:09
Murr
NEW 01.06.11 22:09 
in Antwort digital.pilot 01.06.11 21:50
Зачем он, кстати?
------
Не получилось сформулировать условия упорядочения внутренних селектов - тоже ругань на Ордер Ба на внутренних...
на внешний селект
-----
Внешний селект отрабатывает без проблем... только выборка не упорядочена... видимо нужен алиас...
#18 
  digital.pilot патриот02.06.11 00:51
digital.pilot
NEW 02.06.11 00:51 
in Antwort Murr 01.06.11 22:09
алиас нужен, да. А просто select ... union select ... order by разве не то же самое?
#19 
Murr патриот02.06.11 08:31
Murr
NEW 02.06.11 08:31 
in Antwort digital.pilot 02.06.11 00:51
не то же самое?
------
Неа... там сквозная нумерация по <поле> и надо грантировать заданный порядок - упорядоченая голова, упорядоченные хвосты...
#20 
1 2 alle