почему мой вложенный курсор отображает в два раза результаты? - PullRequest
0 голосов
/ 10 марта 2019

Я использую вложенные курсоры для извлечения последнего часа работы для разных людей. Для этого я сначала беру идентификаторы каждого человека в первом курсоре и отправляю идентификаторы второму курсору, который выбирает максимум (час) для идентификатора каждого человека. Возвращенные значения верны, но отображаемые результаты дублируются, если только когда я проверяю только первый курсор, он отображает только один результат для каждого идентификатора. Может быть, ответ легко увидеть, но я не после многих попыток решить его. Спасибо за вашу помощь. Вот мой код:

block1:

BEGIN
    DECLARE no_more_rows INT DEFAULT FALSE;
    DECLARE v_idChauffeur VARCHAR(7);

    DECLARE c_idChauffeur CURSOR FOR
        SELECT DISTINCT id_chauffeur FROM temp 
        RIGHT JOIN chauffeur 
        ON temp.logon = chauffeur.matricule_chauffeur
        WHERE logon IN (SELECT matricule_chauffeur from chauffeur)
        order by id_chauffeur;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_rows = TRUE;

    OPEN c_idChauffeur;
        get_idChauffeur:LOOP
            FETCH c_idChauffeur INTO v_idChauffeur;
            IF no_more_rows THEN CLOSE c_idChauffeur;
            LEAVE get_idChauffeur;
            END IF;

block2:

BEGIN
DECLARE no_more_rows2 INT DEFAULT FALSE;
DECLARE v_maxHeure VARCHAR(20);

DECLARE c_maxHeure CURSOR FOR
    SELECT DISTINCT(max(heure)) as heure from temp
    right join chauffeur ON temp.logon = chauffeur.matricule_chauffeur
    where id_chauffeur = v_idChauffeur
    order by heure;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_rows2 = TRUE;

OPEN c_maxHeure;
    get_maxHeure:LOOP
        FETCH c_maxHeure INTO v_maxHeure;
        SELECT v_maxHeure,v_idChauffeur;
        IF no_more_rows2 THEN CLOSE c_maxHeure;
        LEAVE get_maxHeure;
        END IF;
    END LOOP get_maxHeure;
    END BLOCK2;
END LOOP get_idChauffeur;
END BLOCK1

А вот некоторые из дублированных результатов:

v_maxHeure 23:02:17 v_idChauffeur 93
v_maxHeure 23:02:17 v_idChauffeur 93


v_maxHeure 23:24:12 v_idChauffeur 99
v_maxHeure 23:24:12 v_idChauffeur 99

v_maxHeure 15:19:28 v_idChauffeur 100
v_maxHeure 15:19:28 v_idChauffeur 100

Спасибо за вашу помощь

1 Ответ

0 голосов
/ 11 марта 2019

Код действительно кажется сложным для довольно простой задачи БД. Исходя из предположения из вашего кода, есть две таблицы (temp & chauffeur), которые объединены с помощью "temp.logon = chauffeur.matricule_chauffeur". Теперь вы хотите получить различные записи Max (час) (то есть max (temp.heure)) и ID человека (то есть id_chauffeur). Я полагаю, что вышеупомянутая задача может быть достигнута с помощью довольно менее сложного запроса, как показано ниже.

SELECT DISTINCT(max(temp.heure)) as heure, temp.id_chauffeur
FROM temp INNER JOIN chauffeur ON temp.logon = chauffeur.matricule_chauffeur
ORDER BY temp.heure;

(Примечание: я только что скомпилировал запрос с пробным прогоном, так как у меня нет структуры таблицы. Надеюсь, это сработает для вас ... Ура!)

...