2017-09-06 1 views
0

J'essaie de combiner ces deux requêtes, mais j'ai des problèmes car les sous-requêtes ne peuvent renvoyer qu'une seule valeur. J'utilise NetBeans IDE, Java DB et Apache Derby.Sous-requête SQL: deux valeurs doivent être renvoyées

Ce que je besoin est retourné nom et prénom, ainsi que le nombre de livres qu'ils ont écrit de l'auteur - et seul celui qui a le plus écrit:

SELECT AUTHOR_FIRST_NAME || ' ' || AUTHOR_LAST_NAME AS AUTHOR_NAME 
FROM Authors 
WHERE AUTHOR_ID = (SELECT AUTHOR_ID, COUNT(*) AS num_books_read 
FROM Books 
GROUP BY AUTHOR_ID 
ORDER BY num_books_read DESC 
FETCH FIRST 1 ROW ONLY); 

J'ai essayé de faire des jointures aussi bien mais ne peut pas obtenir le résultat dont j'ai besoin.

+0

Marquez votre question avec la base de données que vous utilisez. –

Répondre

0

Vous n'avez pas besoin de deux valeurs retournées:

SELECT AUTHOR_FIRST_NAME || ' ' || AUTHOR_LAST_NAME AS AUTHOR_NAME 
FROM Authors 
WHERE AUTHOR_ID = (SELECT AUTHOR_ID 
        FROM Books 
        GROUP BY AUTHOR_ID 
        ORDER BY COUNT(*) DESC 
        FETCH FIRST 1 ROW ONLY 
       ); 

EDIT:

Si vous voulez que le nombre réel, déplacez ensuite la sous-requête à la clause FROM:

SELECT (a.AUTHOR_FIRST_NAME || ' ' || a.AUTHOR_LAST_NAME) AS AUTHOR_NAME, b.num_books_read 
FROM Authors a JOIN 
    (SELECT AUTHOR_ID, COUNT(*) as num_books_read 
     FROM Books 
     GROUP BY AUTHOR_ID 
     ORDER BY num_books_read DESC 
     FETCH FIRST 1 ROW ONLY 
    ) b 
    ON a.AUTHOR_ID = b.AUTHOR_ID; 
+0

Droite. Cela aide certainement, mais j'ai aussi besoin de récupérer le nombre de livres. – beh1

0

Qu'est-ce que à propos de la sélection de l'ID_auteur avec le nombre de livres écrits dans une sous-sélection et d'un INNER JOIN avec le tableau Auteurs:

SELECT A.AUTHOR_FIRST_NAME || ' ' || A.AUTHOR_LAST_NAME AS AUTHOR_NAME 
     ,MAX.CTR 
FROM Authors A 
INNER JOIN 
    (
    SELECT AUTHOR_ID 
      ,COUNT(*) AS CTR 
     FROM Books 
    GROUP BY AUTHOR_ID 
    ORDER BY COUNT(*) DESC 
     FETCH FIRST 1 ROW ONLY 
    ) MAX 
    ON MAX.AUTHOR_ID = A.AUTHOR_ID 
+0

Il n'aime pas la syntaxe pour une raison quelconque. [Exception, code d'erreur 30 000, SQLState 42X01] Erreur de syntaxe: "." à la ligne 2, colonne 12. – beh1

0
select 
     A.author_first_name || ' ' || A.author_last_name as author_name 
     B.total_books number_of_books_written 
    from authors A 
    inner join (
    select top 1 
     author_id 
     , count(*) [total_books] 
    from books 
    group by author_id 
    order by count(*) desc 
    ) B on A.author_id = B.author_id 

Désolé pour la mise en forme, je pense que ceci est ma première réponse soumise.

+0

Malheureusement, ma base de données Java DB/Derby n'autorise pas la syntaxe TOP 1 - seulement FETCH FIRST _ ROW ONLY. J'ai essayé d'éditer la syntaxe mais toujours pas aller. – beh1