Oracle
 sql >> Base de données >  >> RDS >> Oracle

Correction de l'erreur "ORA-01789 :le bloc de requête a un nombre incorrect de colonnes de résultats"

Si vous obtenez l'erreur "ORA-01789 :le bloc de requête a un nombre incorrect de colonnes de résultats" dans Oracle Database, c'est probablement parce que vous essayez d'utiliser un opérateur tel que UNION , INTERSECT , ou EXCEPT pour exécuter une requête composée, mais le SELECT les instructions de part et d'autre de l'opérateur renvoient un nombre différent de colonnes.

Pour résoudre ce problème, assurez-vous simplement que les deux requêtes renvoient le même nombre de colonnes.

Exemple d'erreur

Voici un exemple de code qui génère l'erreur :

SELECT EmployeeName FROM Employees
UNION
SELECT CustomerId, CustomerName FROM Customers;

Résultat :

ORA-01789: query block has incorrect number of result columns

Ici, j'utilise le UNION opérateur pour créer une requête composée. Malheureusement, je reçois une erreur, car je n'ai inclus qu'une seule colonne dans la première requête, mais deux colonnes dans la seconde.

Solution

La façon de résoudre ce problème est de s'assurer que les deux requêtes renvoient le même nombre de colonnes.

Nous pouvons donc soit ajouter une nouvelle colonne au premier SELECT déclaration :

SELECT EmployeeId, EmployeeName FROM Employees
UNION
SELECT CustomerId, CustomerName FROM Customers;

Résultat :

ID EMPLOYÉ NOM DE L'EMPLOYÉ
1 Bart
1 Mia
2 Jan
2 Rohit
3 Ava
3 Pierre
4 Ava
4 Rohit
5 Monish
6 Monish
7 Monish

Ou nous pourrions supprimer l'une des colonnes de la deuxième requête :

SELECT EmployeeName FROM Employees
UNION
SELECT CustomerName FROM Customers;

Résultat :

NOM DE L'EMPLOYÉ
Ava
Bart
janvier
Mia
Monish
Pierre
Rohit

N'oubliez pas que vous pouvez obtenir des résultats très différents selon l'option que vous utilisez. En fait, nous avons obtenu des résultats différents dans notre exemple ci-dessus.

C'est parce que le UNION l'opérateur renvoie des lignes distinctes à moins qu'il ne soit ajouté avec le ALL mot-clé. Lorsque nous avons inclus les colonnes "ID", cela a rendu certaines lignes distinctes alors qu'elles ne l'auraient pas été si nous n'avions renvoyé que les colonnes "nom". Ensuite, lorsque nous avons exclu les colonnes "ID", nous avons obtenu les valeurs uniques des colonnes "nom".

Si vous voulez réellement que les valeurs en double soient renvoyées, vous pouvez utiliser le ALL mot-clé.

Par conséquent, nous pouvons modifier notre dernier exemple comme suit :

SELECT EmployeeName FROM Employees
UNION ALL
SELECT CustomerName FROM Customers;

Résultat :

NOM DE L'EMPLOYÉ
Bart
janvier
Ava
Rohit
Monish
Monish
Monish
Mia
Rohit
Pierre
Ava
Monish
Monish