• Unknown_user (05.01.11 13:55) [0]
    Знатоки 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 не работает.

    Где я туплю?
  • Вариант (05.01.11 14:25) [1]

    > Unknown_user   (05.01.11 13:55)


    И в твоем запросе нужен только один LEFT JOIN  между
    customers и streets
  • sniknik © (05.01.11 14:36) [2]
    > Где я туплю?
    тут
    > LEFT JOIN не работает.
  • Unknown_user (05.01.11 15:08) [3]
    >И в твоем запросе нужен только один 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 запрос? Не понимаю, объясните.
  • 12 © (05.01.11 15:12) [4]
    >
    > 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
  • Palladin © (05.01.11 15:13) [5]
  • Unknown_user (05.01.11 15:52) [6]
    >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 © (05.01.11 16:10) [7]
    > А можно полностью и с раскодированными именами таблиц.
    это ТЗ, под копипаст? сумма не озвучена.

    > но своего случая я в примерах не нашел.
    описание "как работает" не "кормит одноразово" оно "учит ловить рыбу".
  • Unknown_user (05.01.11 17:20) [8]
    >sniknik

    Давайте не будем алчными. delphimaster.ru всегда был хорошим местом взаимопомощи. Надеюсь, таким и останется.

    Мой случай настолько сложный, что за решение нужно платить деньги?
  • Palladin © (05.01.11 17:21) [9]
    проблема в том что - несложный, вот за это уже надо
  • sniknik © (05.01.11 18:00) [10]
    > Мой случай настолько сложный, что за решение нужно платить деньги?
    настолько простой, что уже не взаимопомощь, а репетиторство.
  • sniknik © (05.01.11 18:04) [11]
    +
    немного ошибся, запутали меня... "взаимопомощь" это когда "взаимо" т.е. "ты мне, я тебе".
    покажи где ты мне помогал.
  • Unknown_user (05.01.11 18:23) [12]
    Почему-то мне кажется, вы не поняли моей задачи. И потому она кажется вам простой и недостойной решения. У меня связи 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) таблицы, значения из которых мне нужно получить.
  • 12 © (05.01.11 18:36) [13]
    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
  • Anatoly Podgoretsky © (05.01.11 18:38) [14]
    Не можешь в одном соединение, сделай несколько.
  • Unknown_user (05.01.11 19:02) [15]
    >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.11 20:22) [16]
    не за что
    это настолько элементарно, что никто и отвечать просто не захотел
    это азбука.


    > Вот решение, если кто-то не понял.

    михалкову за перепечатку азбуки платить придется :)
  • Anatoly Podgoretsky © (05.01.11 21:13) [17]
    > 12  (05.01.2011 20:22:16)  [16]

    Как это он про учебники и книги забыл.
  • Unknown_user (05.01.11 21:19) [18]
    >12

    Я базами данных никогда никогда не занимался, хотя и использую делфи много лет. Моя специализация веб-картография и трехмерное моделирование, вот такие карты делаем:

    http://www.vin3d.net

    А SQL я только полмесяца изучаю. Дали задание разработать структуру БД и приложение к ней.

    А этот сайт мне мне неоднократно помогал, благодаря таким специалистам как Вы. Выражаю им благодарность. Мир все таки не без добрых людей :)
  • Unknown_user (05.01.11 21:21) [19]
    >Как это он про учебники и книги забыл.

    Не те учебники видать читаю.

    http://www.w3schools.com/sql/sql_join_left.asp

    Тут слишком упрощенный подход.
  • 12 © (05.01.11 21:29) [20]
    http://www.sql.ru/ - наше все :)
  • MsGuns © (06.01.11 11:49) [21]
    >Unknown_user   (05.01.11 21:19) [18]
    >вот такие карты делаем:

    >http://www.vin3d.net

    Глючит при масштабировании
  • Unknown_user (06.01.11 16:05) [22]
    >http://www.sql.ru/ - наше все :)

    Спасибо, буду изучать дальше

    >Глючит при масштабировании

    Как глючит? в 2D или 3D?
Есть новые Нет новых   [134432   +19][b:0][p:0.002]