Вложенный оператор Select в MYSQL join - PullRequest
12 голосов
/ 25 августа 2011
SELECT * FROM A
JOIN B
ON B.ID = A.ID
AND B.Time =   (SELECT max(Time) 
                            FROM B B2
                            WHERE B2.ID = B.ID)

Я пытаюсь объединить эти две таблицы в MYSQL. Не обращайте внимания на то, что если идентификатор уникален, я бы не стал этого делать. Я сжал реальное решение, чтобы нарисовать упрощенную картину. Я пытаюсь взять и присоединиться к таблице B на максимальную дату для определенной записи. Эта процедура запускается пакетом служб SSIS и сообщает, что B2.ID - это неизвестный столбец. Я часто делаю такие вещи в MSSQL, и я новичок в MYSQL. У кого-нибудь есть указания или идеи?

1 Ответ

27 голосов
/ 25 августа 2011

Я делаю этот тип запроса по-другому, с исключающим соединением вместо подзапроса. Вы хотите найти строки B, которые имеют максимальное время для данного идентификатора; другими словами, где ни одна другая строка не имеет большего времени и того же идентификатора.

SELECT A.*, B.*
FROM A JOIN B ON B.ID = A.ID
LEFT OUTER JOIN B AS B2 ON B.ID = B2.ID AND B.Time < B2.Time
WHERE B2.ID IS NULL

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

SELECT A.*, B.*
FROM A JOIN B ON B.ID = A.ID
JOIN (SELECT ID, MAX(Time) AS Time FROM B GROUP BY ID) AS B2
  ON (B.ID, B.Time) = (B2.ID, B2.Time)

P.S .: Я добавил тег greatest-n-per-group. Этот тип вопросов SQL возникает каждую неделю в переполнении стека, поэтому вы можете следовать этому тегу, чтобы увидеть десятки похожих вопросов и ответы на них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...