Ваш запрос не является действительным SQL и даже не ясно, что вы пытаясь достичь с этим. (Должен признаться, я даже не угадал цель вашего запроса.) Вы должны сказать нам, что должен делать запрос, а не просить нас указать на ваши синтаксические ошибки.
Во всяком случае, давайте начнем с производной таблицы:
SELECT customer_id, timestamp
FROM table1 c
HAVING c.timestamp < w.timestamp
AND timestamp = MAX(c.timestamp)
Вы выбираете TABLE1 записи (ограниченный столбцам customer_id и метки времени, чтобы быть точным). Вы выбираете все строки (нет предложения WHERE). Тогда есть предложение HAVING. Это недействительно здесь. Предложение HAVING работает после агрегирования значений, например. если вы выбрали MIN (customer_id) и MAX (временную метку) как одну запись или группу (с GROUP BY). Как и в случае с вашим предложением HAVING, нет никакого смысла, и я действительно задаюсь вопросом, как вы получили идею использовать его вообще.
Затем в разделе HAVING вы сравниваете отметку времени с MAX (отметка времени). Вы не можете сделать это. Есть время до агрегации, когда вы можете посмотреть, например, запись и столбец timestamp. Затем есть время после агрегации, когда вы можете посмотреть MAX (временная метка). Вы не видите их одновременно. Для этого вам нужно будет выбрать одну и ту же таблицу дважды, один раз, чтобы посмотреть на отдельные записи, один раз, чтобы посмотреть на агрегацию. Как и в:
SELECT customer_id, timestamp
FROM table1 c
WHERE timestamp = (select MAX(timestamp) from table1)
Здесь я проверяю для каждой записи, равен ли его временная метка максимальной метки времени для таблицы и сохранить только те записи.
Кроме того, вы получаете доступ к w.timestamp, который не отображается здесь. Вы можете сравнить только временную метку вне запроса производной таблицы:
FROM table1 w
FULL OUTER JOIN
(
SELECT customer_id, timestamp
FROM table1
WHERE timestamp = (select MAX(timestamp) from table1)
) c ON c.timestamp = w.timestamp
Наконец-то вы делаете полное внешнее соединение. Зачем? X FULL OUTER JOIN Y
хранит записи X, которые недоступны в Y и наоборот. Вы, однако, выбираете FROM table1 w
, поэтому вы получаете все записи из таблицы1 и присоединяетесь к подмножеству таблицы1 (ваш производный запрос таблицы). Таким образом, не может быть записей из производной таблицы, которые не соответствуют таблице 1. Следовательно, внешнее соединение полное не имеет никакого смысла. Затем в предложении WHERE вашего запроса вы запрашиваете определенный w.customer_id. Если внешнее соединение будет работать, вы должны составить записи, где w.customer_id - null. Предложение WHERE приведет к их устранению. Другая причина, почему ваше полное внешнее соединение не имеет смысла.
Что еще? Ну, вы спрашиваете w.customer_id IN (SELECT customer_id, timestamp FROM ...)
. Это синтаксически неправильно. Единственное значение w.customer_id
никогда не может совпадать с парой значений customer_id, timestamp
. Вместо этого вы можете задать w.customer_id IN (SELECT customer_id FROM ...)
.
Затем в вашем основном запросе вы используете HAVING, хотя агрегации не производится.
Я думаю, было бы хорошо, если бы вы практиковали очень простые запросы. Запрос с WHERE. Запрос с агрегацией, скажем, MAX. Запрос с агрегацией на группу (т. Е. С использованием GROUP BY). Запрос с агрегацией и предложение HAVING. Запрос с предложением WHERE и a HAVING ...
Что касается вашего запроса здесь: Возможно, то, что я сказал выше, поможет вам построить его шаг за шагом. Если нет, вернитесь и сообщите нам, что должен делать ваш запрос, и мы покажем вам, как это сделать.
Правила определения области применения. Просто переместите условие «c.timestamp
jarlh
Так что я мог бы написать: SELECT w.timestamp, c.timestamp ИЗ table1 ш полное внешнее соединение (SELECT customer_id, метку времени FROM table1 с HAVING метку времени = MAX (c.timestamp)) c ВКЛ w.customer_id
Nic2352
Не уверен, что это сработает для меня, поскольку я пытаюсь присоединиться к client_id, но только когда c.timestamp
Nic2352