Почему этот простой подзапрос не работает? - PullRequest
2 голосов
/ 29 марта 2012

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

DELETE FROM table1  p
WHERE member_id IN (1, 2,3)
AND create_dttm < (SELECT MAX(create_dttm) 
                   FROM table1   
                   WHERE  member_id = p.member_id)

Но я получаю сообщение об ошибке

Неверный синтаксис рядом с 'p'.

Я могу легко написать 3 запроса, чтобы выполнить работу. Но было интересно узнать, что здесь происходит не так? Подскажите, пожалуйста, как правильно написать этот запрос?

Заранее спасибо

Ответы [ 4 ]

2 голосов
/ 29 марта 2012

В качестве альтернативы вы можете создать псевдоним таблицы в подзапросе и ссылаться на внешние экземпляры member_id по реальному имени таблицы:

DELETE FROM table1
WHERE WHERE member_id IN (1, 2,3)
AND create_dttm < (SELECT MAX(create_dttm) 
                   FROM table1 p
                   WHERE  table1.member_id = p.member_id)

В SQL Server, когда выприсваивая псевдоним таблице, вы больше не можете ссылаться на эту таблицу по ее первоначальному имени в том же операторе.Таким образом, добавив префикс столбцов к table1. в подзапросе, вы наверняка будете ссылаться на внешнюю таблицу.

2 голосов
/ 29 марта 2012

Попробуйте

DELETE p
FROM table1  p
WHERE member_id IN (1, 2,3)
AND create_dttm < (SELECT MAX(create_dttm) 
                   FROM table1   
                   WHERE  member_id = p.member_id)
1 голос
/ 29 марта 2012

Попробуйте выполнить

DELETE p FROM table1 p
WHERE member_id IN (1, 2,3)
AND create_dttm < (SELECT MAX(create_dttm) 
                   FROM table1   
                   WHERE  member_id = p.member_id)
1 голос
/ 29 марта 2012

И используйте псевдоним для таблиц:

DELETE FROM table1 p
WHERE p.member_id IN (1, 2,3)
AND p.create_dttm < (SELECT MAX(p1.create_dttm) 
                   FROM table1 p1 
                   WHERE p1.member_id = p.member_id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...