Как сослаться на псевдоним столбца в предложении WHERE - PullRequest
2 голосов
/ 02 мая 2020

Я хочу сравнить псевдоним (в котором есть пробелы) с пробелом в предложении WHERE.

select r.resortid, sum(b.adultcount+b.childcount) as "Total Guest"
from   resort r, booking b
where  r.resortid = b.resortid and "Total Guest" <= 10
group by r.resortid
order by r.resortid;

Полученная ошибка:

where  r.resortid=b.resortid and "Total Guest" <=10
                                 *
ERROR at line 3:
ORA-00904: "Total Guest": invalid identifier

Ответы [ 4 ]

3 голосов
/ 02 мая 2020

Использовать HAVING Предложение и использовать явный стандартный синтаксис JOIN вместо запятой отдельно:

SELECT r.resortid, SUM(b.adultcount+b.childcount)
FROM resort r INNER JOIN
     booking b
     ON r.resortid = b.resortid 
GROUP BY r.resortid
HAVING SUM(b.adultcount+b.childcount) <= 10;

Where предложение фильтрует только необработанные данные не после агрегирования данных.

2 голосов
/ 02 мая 2020

Нельзя ссылаться на псевдоним в условии, определенном в том же операторе sql.

У вас есть 3 возможности в базах данных Oracle / MariaDB / MySQL:

1 ) Перепишите вычисляемый столбец, и, если он рассчитывается с помощью функции агрегирования, вы должны поместить условие в условие «HAVING»:

SELECT r.resortid, sum(b.adultcount+b.childcount) as "Total Guest"
  FROM resort r, booking b
 WHERE r.resortid = b.resortid
 GROUP BY r.resortid
  HAVING sum(b.adultcount+b.childcount) <= 10
ORDER BY r.resortid;

2) Используя подзапрос:

SELECT *
  FROM
    (SELECT r.resortid, sum(b.adultcount+b.childcount) as TotalGuest
      FROM resort r, booking b
     WHERE r.resortid = b.resortid
     GROUP BY r.resortid) AS totalg
 WHERE TotalGuest <= 10
ORDER BY resortid;

3) Напишите подзапрос, используя предложение WITH:

WITH totalg AS
(SELECT r.resortid, sum(b.adultcount+b.childcount) as TotalGuest
  FROM resort r, booking b
 WHERE r.resortid = b.resortid
GROUP BY r.resortid)
SELECT *
  FROM totalg
 WHERE TotalGuest <= 10
ORDER BY resortid;
2 голосов
/ 02 мая 2020

Учитывая, что курорт может не иметь бронирований, я бы рекомендовал left join:

select r.resortid, coalesce(sum(b.adultcount + b.childcount), 0) as total_guests
from resort r join
     booking b 
     on r.resortid = b.resortid 
group by r.resortid
having coalesce(sum(b.adultcount + b.childcount), 0) <= 10
order by r.resortid;

Если на всех курортах бронируются, то join не требуется:

select b.resortid, sum(b.adultcount + b.childcount) as total_guests
from booking b 
group by b.resortid
having sum(b.adultcount + b.childcount) <= 10
order by r.resortid;
0 голосов
/ 02 мая 2020

Having, а не where; Кроме того, JOIN не принесет вреда.

select r.resortid, 
       sum(b.adultcount + b.childcount) as "Total Guest"
from resort r join booking b on r.resortid = b.resortid 
group by r.resortid
having sum(b.adultcount + b.childcount) <= 10
order by r.resortid;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...