Использование своего рода цикла в подзапросе SQL - PullRequest
0 голосов
/ 21 ноября 2011

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

SELECT lA.attendance_id, lA.time_in, lA.time_out, lS.title, lS.end_time, lU.uid
FROM logi_attendance AS lA
INNER JOIN
    logi_users AS lU ON lA.user_id = lU.user_id
    INNER JOIN
        logi_shifts AS lS ON lU.shift_id = lS.shift_id
WHERE
(lA.time_in IS NOT NULL) AND
(lA.time_out IS NULL) AND
(lA.attendance_id =
    (
    SELECT TOP (1) A.attendance_id
    FROM logi_attendance AS A
    INNER JOIN
        logi_users AS B ON A.user_id = B.user_id
        ORDER BY A.attendance_id DESC
    )
)

Как вы видите, я использовал подзапрос для получения последних записей каждого пользователя (новые записи создаются ежедневно), поэтому получение последней записи является обязательным требованием. Теперь посмотрим, что я использовал TOP (1) в подзапросе, который ограничивает его возвращением только 1 записи. Это позволяет основному запросу успешно выполняться, но это бесполезно, потому что он возвращает запись только одного пользователя, которого он находит первым. Но я хочу получить результаты всех пользователей, но это должно быть сделано так, чтобы подзапрос возвращал каждый последний идентификатор один за другим, чтобы основной запрос выполнялся успешно. Прямо сейчас, если я удаляю TOP (1), то выдает ошибку, что подзапрос возвращает более 1 значения, что неверно.

Не знаю, правильно ли я объяснил, дайте мне знать, если вы не понимаете, о чем я пытаюсь спросить, и я постараюсь объяснить лучше.

Спасибо.

Ответы [ 3 ]

1 голос
/ 21 ноября 2011

Вы должны быть в состоянии добавить

WHERE A.user_id = lA.user_id

к вашему подзапросу. Это даст вам самую последнюю запись на пользователя.

0 голосов
/ 21 ноября 2011

Ваш подзапрос не коррелирован.Вам нужен коррелированный подзапрос, как показано ниже:

SELECT lA.attendance_id, lA.time_in, lA.time_out, lS.title, lS.end_time, lU.uid
FROM logi_attendance AS lA
INNER JOIN
    logi_users AS lU ON lA.user_id = lU.user_id
    INNER JOIN
        logi_shifts AS lS ON lU.shift_id = lS.shift_id
WHERE
(lA.time_in IS NOT NULL) AND
(lA.time_out IS NULL) AND
(lA.attendance_id =
    (
    SELECT TOP (1) A.attendance_id
    FROM logi_attendance AS A
    INNER JOIN
        logi_users AS B ON A.user_id = B.user_id
--make it correlated:
    WHERE A.user_id = lU.user_id
        ORDER BY A.attendance_id DESC
    )
)
0 голосов
/ 21 ноября 2011

Не на 100% уверен в решении, но причина, по которой он нуждается в ТОП-1, заключается в том, что вы тестируете lA.attendance_id = something, и что-то должно быть только 1 результатом.

Попробуйте изменить его на lA.attendance_id IN (select xxxxx) и этодолжен получить больше результатов.

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