-
Знатоки 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 (05.01.11 13:55)
И в твоем запросе нужен только один LEFT JOIN между customers и streets
-
> Где я туплю? тут > LEFT JOIN не работает.
-
>И в твоем запросе нужен только один 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 запрос? Не понимаю, объясните.
-
> > 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
-
-
>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
спасибо за ссылку, но своего случая я в примерах не нашел.
-
> А можно полностью и с раскодированными именами таблиц. это ТЗ, под копипаст? сумма не озвучена.
> но своего случая я в примерах не нашел. описание "как работает" не "кормит одноразово" оно "учит ловить рыбу".
-
>sniknik
Давайте не будем алчными. delphimaster.ru всегда был хорошим местом взаимопомощи. Надеюсь, таким и останется.
Мой случай настолько сложный, что за решение нужно платить деньги?
-
проблема в том что - несложный, вот за это уже надо
-
> Мой случай настолько сложный, что за решение нужно платить деньги? настолько простой, что уже не взаимопомощь, а репетиторство.
-
+ немного ошибся, запутали меня... "взаимопомощь" это когда "взаимо" т.е. "ты мне, я тебе". покажи где ты мне помогал.
-
Почему-то мне кажется, вы не поняли моей задачи. И потому она кажется вам простой и недостойной решения. У меня связи 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) таблицы, значения из которых мне нужно получить.
-
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
-
Не можешь в одном соединение, сделай несколько.
-
>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, спасибо еще раз.
-
не за что это настолько элементарно, что никто и отвечать просто не захотел это азбука.
> Вот решение, если кто-то не понял.
михалкову за перепечатку азбуки платить придется :)
-
> 12 (05.01.2011 20:22:16) [16]
Как это он про учебники и книги забыл.
-
>12 Я базами данных никогда никогда не занимался, хотя и использую делфи много лет. Моя специализация веб-картография и трехмерное моделирование, вот такие карты делаем: http://www.vin3d.netА SQL я только полмесяца изучаю. Дали задание разработать структуру БД и приложение к ней. А этот сайт мне мне неоднократно помогал, благодаря таким специалистам как Вы. Выражаю им благодарность. Мир все таки не без добрых людей :)
-
-
-
>Unknown_user (05.01.11 21:19) [18] >вот такие карты делаем: > http://www.vin3d.net Глючит при масштабировании
-
> http://www.sql.ru/ - наше все :) Спасибо, буду изучать дальше >Глючит при масштабировании Как глючит? в 2D или 3D?
|