Хранимая процедура, объединяющая результирующие наборы

#mysql #sql #stored-procedures

#mysql #sql #хранимые процедуры

Вопрос:

Когда я запускаю хранимую процедуру ниже mysql, я получаю три разные таблицы в качестве выходных данных. Есть ли какой-либо способ объединить эти три таблицы и отобразить выходные данные как в одной таблице с разными столбцами и одной строкой?

     CREATE DEFINER=`root`@`localhost` PROCEDURE `retrieveApplicantStatus`(IN in_userId INT)
BEGIN
    SELECT applicants_id, approval FROM applicants WHERE users_id = in_userId;

    SELECT pass_fail.result AS test_result, pass_fail.license_approval FROM pass_fail WHERE user_id = in_userId;

    SELECT result AS trial_result FROM trial_result WHERE user_id = in_userId;
END
 

Требуемый вывод :

 --------------------------------------------------------------------------
applicants_id | approval | test_result | trial_result | license_approval |
--------------------------------------------------------------------------
              |          |             |              |                  |
--------------------------------------------------------------------------
 

Комментарии:

1. UNION ALL ? Если факт, если вы хотите установить одну строку, то все три текущих набора tow логически должны иметь одинаковую структуру

2. СПАСИБО за ответ, позвольте мне посмотреть, как это выглядит!

3. Хорошо, продолжайте и посмотрите

4. Похоже ли, что он вернет один столбец?

5. @AlmaDo, я пробежал страницу, но это не то, что я хочу. Я хочу, чтобы из этой процедуры была одна строка и несколько столбцов. Есть ли способ?

Ответ №1:

Если user_id ограничено, чтобы быть уникальным в каждой таблице, тогда вы можете использовать:

 CREATE DEFINER=`root`@`localhost` PROCEDURE `retrieveApplicantStatus`(IN in_userId INT)
BEGIN
    SELECT  u.in_userId,
            a.applicants_id, 
            a.approval,
            pf.result AS test_result, 
            pf.license_approval,
            tr.result AS trial_result
    FROM    (SELECT in_userId) AS u
            LEFT JOIN applicants AS a
                ON a.users_id = u.in_userId
            LEFT JOIN pass_fail AS pf
                ON pf.user_id = u.in_userId
            LEFT JOIN trial_result AS tr
                ON tr.user_id = u.in_userId;
END
 

ОДНАКО, если он не ограничен уникальностью, это даст вам декартово произведение, т.Е. 2 строки в каждой таблице дадут вам всего 8 строк, 3 строки в каждой таблице дадут вам 27 результатов.

Ответ №2:

Попробуйте использовать следующий код:-

 BEGIN
    SELECT applicants_id, approval 
    FROM applicants WHERE users_id = in_userId;
        UNIION ALL
    SELECT pass_fail.result AS test_result, pass_fail.license_approval 
    FROM pass_fail 
    WHERE user_id = in_userId;
        UNION ALL
    SELECT result AS trial_result 
    FROM trial_result 
    WHERE user_id = in_userId;
END
 

Комментарии:

1. Вздох , пожалуйста, хотя бы попробуйте свой код. Она даже не будет выполнена из-за разного количества столбцов в наборах строк

2. Но, насколько я понимаю, если мы хотим выбрать несколько столбцов из нескольких таблиц, тогда мы должны использовать UNION ALL предложение, как и я.

3. Да, и, насколько я вижу, у вас много ошибок в вашем коде: разное количество столбцов для ОБЪЕДИНЕНИЯ, использование разделителя sql внутри запроса, смешивание псевдонимов для столбца и таблицы и т. Д. Это не то, что должно быть ответом на SO. Ответы должны быть проверены и после этого — опубликованы со всеми необходимыми пояснениями.

4. Ну, я просто пытался рассказать логику лучше, чем рассказывать весь код, как ложкой, вот почему я не тестировал код. Но все же мне нужно оправдание, если что-то пошло не так.