MySQL Как я могу использовать результат сохраненной функции в качестве параметра в том же операторе SELECT

#mysql #sql #subquery #inner-join #sql-function

#mysql #sql #подзапрос #внутреннее соединение #sql-функция

Вопрос:

Итак, мой вопрос в том, как я могу использовать результат berekenKosten() в качестве параметра nogTeBetalen() в том же операторе SELECT? Вот мой код:

 SELECT boeking.Boekingnr, Naam, Telefoonnr, boeking.Aantal_volwassenen, reis.Prijs_per_persoon, boeking.Betaald_bedrag, 
berekenKosten(reis.Prijs_per_persoon, boeking.Aantal_volwassenen) AS totaalprijs, nogTeBetalen()
FROM klant
INNER JOIN boeking ON klant.Klantnr = boeking.Klantnr
INNER JOIN reis ON boeking.Reisnr = reis.Reisnr
  

если это невозможно, как я могу отобразить результат nogTeBetalen() в виде столбца для каждой строки?

я уже пробовал это, но это не сработало:

 SELECT boeking.Boekingnr, Naam, Telefoonnr, boeking.Aantal_volwassenen, reis.Prijs_per_persoon, boeking.Betaald_bedrag, 
berekenKosten(reis.Prijs_per_persoon, boeking.Aantal_volwassenen) AS totaalprijs, nogTeBetalen(totaalprijs)
FROM klant
INNER JOIN boeking ON klant.Klantnr = boeking.Klantnr
INNER JOIN reis ON boeking.Reisnr = reis.Reisnr
  

Ответ №1:

Вы можете вложить вызовы:

 SELECT 
    b.Boekingnr, 
    Naam, 
    Telefoonnr, 
    b.Aantal_volwassenen, 
    r.Prijs_per_persoon, 
    b.Betaald_bedrag, 
    berekenKosten(r.Prijs_per_persoon, b.Aantal_volwassenen) AS totaalprijs, 
    nogTeBetalen(berekenKosten(r.Prijs_per_persoon, b.Aantal_volwassenen)) as result
FROM klant k
INNER JOIN boeking b ON k.Klantnr = b.Klantnr
INNER JOIN reis r ON b.Reisnr = r.Reisnr
  

Но, вероятно, более эффективно использовать подзапрос, поэтому процедура вызывается только один раз:

 SELECT t.*, nogTeBetalen(totaalprijs) as result
FROM (
    SELECT 
        b.Boekingnr, 
        Naam, 
        Telefoonnr, 
        b.Aantal_volwassenen, 
        r.Prijs_per_persoon, 
        b.Betaald_bedrag, 
        berekenKosten(r.Prijs_per_persoon, b.Aantal_volwassenen) AS totaalprijs
    FROM klant k
    INNER JOIN boeking b ON k.Klantnr = b.Klantnr
    INNER JOIN reis ON b.Reisnr = r.Reisnr
) t
  

Побочные рекомендации:

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

  • сделайте префикс для каждого columnm с (псевдонимом) таблицы, к которой он принадлежит, чтобы запрос был однозначным в отношении базовых структур данных; в предложении есть несколько неквалифицированных столбцов SELECT , которые вам нужно будет исправить