![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
SQL запрос
Unknown_user © (2011-01-05 13:55:00)Знатоки SQL, подскажите. Вроде задача несложная, но что-то не дается никак.
Нужно сформировать запрос для получения информации о заказе (номер заказа) и данные клиента (имя, адрес). Адрес клиента включает ссылки на таблицы settlements и streets. Но улица может не задаваться - ссылка customers.streetid может быть null.
Пишу такой запрос:
SELECT orders.number, customers.name, settlements.name, streets.name
FROM orders, customers, settlements, streets
WHERE orders.customerid=customers.id AND customers.settlementid=settlements.id AND
customers.streetid=streets.id;
Если customers.streetid = null для всех клиентов, запрос возвращает пустой результат. Мне же нужно вывести информацию по всем заказам независимо от того задана ли ссылка на улицу в таблице заказчиков или нет.
Знаю, про LEFT JOIN. Но эта команда задает связи только между 2-мя таблицами. У меня таблиц больше, LEFT JOIN не работает.
Где я туплю?
Unknown_user (2011-01-06 16:05:00) [1]> http://www.sql.ru/- наше все :)
Спасибо, буду изучать дальше
>Глючит при масштабировании
Как глючит? в 2D или 3D?
MsGuns (2011-01-06 11:49:00) [2]>Unknown_user (05.01.11 21:19) [18]
>вот такие карты делаем:
> http://www.vin3d.net
Глючит при масштабировании
12 (2011-01-05 21:29:00) [3]http://www.sql.ru/- наше все :)
Unknown_user (2011-01-05 21:21:00) [4]>Как это он про учебники и книги забыл.
Не те учебники видать читаю.
http://www.w3schools.com/sql/sql_join_left.asp
Тут слишком упрощенный подход.
Unknown_user (2011-01-05 21:19:00) [5]>12
Я базами данных никогда никогда не занимался, хотя и использую делфи много лет. Моя специализация веб-картография и трехмерное моделирование, вот такие карты делаем:
http://www.vin3d.net
А SQL я только полмесяца изучаю. Дали задание разработать структуру БД и приложение к ней.
А этот сайт мне мне неоднократно помогал, благодаря таким специалистам как Вы. Выражаю им благодарность. Мир все таки не без добрых людей :)
Anatoly Podgoretsky (2011-01-05 21:13:00) [6]> 12 (05.01.2011 20:22:16) [16]
Как это он про учебники и книги забыл.
12 (2011-01-05 20:22:00) [7]не за что
это настолько элементарно, что никто и отвечать просто не захотел
это азбука.
> Вот решение, если кто-то не понял.
михалкову за перепечатку азбуки платить придется :)
Unknown_user (2011-01-05 19:02:00) [8]>12
Большое спасибо. Про вложенные JOIN я не знал. Вот решение, если кто-то не понял.
SELECT orders.number, customers.name, settlements.name, streets.name
FROM orders
LEFT JOIN customers ON orders.customerid=customers.id
LEFT JOIN settlements ON customers.settlementid=settlements.id
LEFT JOIN streets ON customers.streetid=streets.id
12, спасибо еще раз.
Anatoly Podgoretsky (2011-01-05 18:38:00) [9]Не можешь в одном соединение, сделай несколько.
12 (2011-01-05 18:36:00) [10]select
from
таблица1 as t1
left join таблица2 as t2 on t1.id=t2.id
left join таблица3 as t3 on t3.id=t2.id
..
left join таблицаN as tN on tN.id=t(N-1).id
where
tК.id is not null
Unknown_user (2011-01-05 18:23:00) [11]Почему-то мне кажется, вы не поняли моей задачи. И потому она кажется вам простой и недостойной решения. У меня связи orders-customers-settlements и orders-customers-streets. Это не обычная ситуация для JOIN, где участвуют 2 таблицы.
>LEFT JOIN QQQQ ON QQQ.WWWWid=customers.WWWWid
where
QQQ.WWWWid is not null
В этом примере связь между 2-мя таблицами. Как ее организовать я понимаю.
Запрос
SELECT orders.number, customers.name, settlements.name, streets.name
FROM orders, customers, settlements, streets
WHERE orders.customerid=customers.id AND customers.settlementid=settlements.id AND
customers.streetid=streets.id;
который я сейчас использую неявно вызывает JOIN. Но он не работает если customers.streetid=null, тогда возвращается пустой набор данных.
Не нашел способа перечислить в JOIN все 4 (важный момент - это цифра 4) таблицы, значения из которых мне нужно получить.
sniknik (2011-01-05 18:04:00) [12]+
немного ошибся, запутали меня... "взаимопомощь" это когда "взаимо" т.е. "ты мне, я тебе".
покажи где ты мне помогал.
sniknik (2011-01-05 18:00:00) [13]> Мой случай настолько сложный, что за решение нужно платить деньги?
настолько простой, что уже не взаимопомощь, а репетиторство.
Palladin (2011-01-05 17:21:00) [14]проблема в том что - несложный, вот за это уже надо
Unknown_user (2011-01-05 17:20:00) [15]>sniknik
Давайте не будем алчными. delphimaster.ru всегда был хорошим местом взаимопомощи. Надеюсь, таким и останется.
Мой случай настолько сложный, что за решение нужно платить деньги?
sniknik (2011-01-05 16:10:00) [16]> А можно полностью и с раскодированными именами таблиц.
это ТЗ, под копипаст? сумма не озвучена.
> но своего случая я в примерах не нашел.
описание "как работает" не "кормит одноразово" оно "учит ловить рыбу".
Unknown_user (2011-01-05 15:52:00) [17]>LEFT JOIN QQQQ ON QQQ.WWWWid=customers.WWWWid
where
QQQ.WWWWid is not null
А можно полностью и с раскодированными именами таблиц. Ключевое поле у меня в каждой таблице называется id. Вот, что мне нужно получить.
SELECT orders.number, customers.name, settlements.name, streets.name
Имеются 4 таблицы. Вывести нужно столько строк, сколько записей в таблице orders.
orders имеет поле orders.customerid - ссылка на customers.id.
customers имеет поле customers.settlementid - ссылка на settlements.id
и также поле customers.streetid - ссылка на streets.id
customers.streetid может быть null
У меня так и не получилось использовать LEFT JOIN. pgAdmin3 выдает ошибку
>There is an entry for table "customers", but it cannot be referenced from this part of the query.
>Palladin
спасибо за ссылку, но своего случая я в примерах не нашел.
Palladin (2011-01-05 15:13:00) [18]http://www.job-blog.bullgare.ru/tag/left-join/
12 (2011-01-05 15:12:00) [19]>
> SELECT reg_customers.name, streets.name
> FROM customers
> LEFT JOIN streets ON customers.streetid=streets.id
LEFT JOIN QQQQ ON QQQ.WWWWid=customers.WWWWid
where
QQQ.WWWWid is not null
Unknown_user (2011-01-05 15:08:00) [20]>И в твоем запросе нужен только один LEFT JOIN между
customers и streets
Не понимаю как, ткните носом. Вот скрипт, выводящий всех клиентов с названием улицы, или пустой строкой если customers.streetid=null
SELECT reg_customers.name, streets.name
FROM customers
LEFT JOIN streets
ON customers.streetid=streets.id
Но мне нужно вывести список заказов из таблицы orders и для каждого заказа в одной строке фамилию заказчика, его город, его улицу.
LEFT JOIN не разрешает задавать больше одной таблицы в секции FROM и секции JOIN.
Это должен быть вложенный SQL запрос? Не понимаю, объясните.