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 |