Проблема SQL-запроса - естественное объединение и именование таблиц - PullRequest
1 голос
/ 12 декабря 2011

У меня возникли сложности с запросом для моего класса баз данных. Дана следующая схема:

  • Клиенты (customerid, first_name, last_name, address, city, state, phone, status)
  • Филиалы (branchno, address, city, state, phone, manager_name)
  • сотрудников (empno, firstname, lastname, address, city, state, phone, emergency_contact, title, managerno)
  • Номера (roomno, branchno, price, bed_size)
  • Заказы (roomno, branchno, customerid, checkin_date, checkout_date, empno)

Я бы хотел найти клиентов, которые сняли самую дорогую комнату. Я попробовал этот запрос ...

SELECT customerid FROM bookings NATURAL JOIN rooms 
EXCEPT
(SELECT customerid FROM (bookings NATURAL JOIN rooms) AS S, (bookings NATURAL JOIN
    rooms) as T WHERE S.price < T.price)

Проблема заключается в том, как я хочу переименовать таблицы. Я хотел бы использовать естественное объединение бронирований и комнат в качестве компонентов декартовой системы ... Как я могу это сделать?

Большое спасибо.

Ответы [ 2 ]

2 голосов
/ 12 декабря 2011

Вы можете использовать это:

SELECT 
    customerid 
FROM 
    Bookings 
  NATURAL JOIN 
    Rooms
  NATURAL JOIN
    ( SELECT MAX(price) AS price
      FROM Rooms
    ) AS MostExpensiveRoom

Ваш запрос кажется правильным, за исключением того, что вам нужно уточнить, какой customerid вы хотите во втором подзапросе, S. или T.. Синтаксис запятой , означает CROSS JOIN между S и T, поэтому у вас есть два значения:

(SELECT customerid FROM bookings NATURAL JOIN rooms)
EXCEPT
(SELECT S.customerid 
 FROM 
     (bookings NATURAL JOIN rooms) AS S
   CROSS JOIN
     (bookings NATURAL JOIN rooms) AS T 
 WHERE S.price < T.price
)
0 голосов
/ 12 декабря 2011
SELECT * FROM customers as c
INNER JOIN bookings as b ON b.customerid = c.customerid
INNER JOIN rooms as r ON r.roomno = b.roomno
ORDER BY r.price DESC
LIMIT 1;

если вам нужны только имена или указанные поля, вы можете использовать GROUP BY.

Этот запрос делает то же самое (если предыдущий синтаксически хорош):

SELECT * FROM customers,bookings,rooms
WHERE bookings.customerid = customers.customerid
AND rooms.roomno = bookings.roomno
ORDER BY rooms.price DESC
LIMIT 1

поэтому, если вы хотите, чтобы идентификаторы и имена были упорядочены по цене аренды:

SELECT customers.customerid, customers.fistname, customers.lastname FROM
customers,bookings,rooms
WHERE bookings.customerid = customers.customerid
AND rooms.roomno = bookings.roomno
ORDER BY rooms.price DESC
GROUP BY customers.customerid, customers.fistname, customers.lastname 
LIMIT 10
...