2010-08-17 5 views
2

L'instruction SQL suivante fonctionne dans MySQL, mais pas avec Oracle:requête fonctionne MySQL ne Oracle

SELECT *, MAX(COLUMN_A) 
    FROM table_xyz 
WHERE COLUMN_A <= 100 
GROUP BY COLUMN_A 

plainte Oracle: "FROM mot-clé introuvable où prévu"


fait la déclaration était incorrect, nous ne sommes pas regroupés par COLUMN_A mais une autre colonne à la place. en fait ce que nous voulons est ce

SELECT *, MAX(COLUMN_A) 
    FROM table_xyz 
WHERE COLUMN_A <= 100 
GROUP BY COLUMN_B 

this works but gives us only column A and B 

SELECT COLUMN_B, MAX(COLUMN_A) 
    FROM table_xyz 
WHERE COLUMN_A <= 100 
GROUP BY COLUMN_B 

what we want is this, but it doesn't work (group by error) 

SELECT COLUMN_B, COLUMN_C .... COLUMN_X, MAX(COLUMN_A) 
    FROM table_xyz 
WHERE COLUMN_A <= 100 
GROUP BY COLUMN_B 
+1

Correct. Vous devrez ajuster la requête. –

+1

Pourriez-vous décrire ce que vous tentez réellement d'accomplir? Cette déclaration n'a vraiment aucun sens –

Répondre

3

C'est parce que Oracle vous oblige à définir toutes les colonnes non enveloppés dans une fonction d'agrégation (MIN, MAX, COUNT, etc.). SQL Server renverrait une erreur similaire. MySQL's behavior is documented here. Comme votre requête utilise SELECT *, je ne peux pas le réécrire correctement pour vous. Mais je ne peux pas non plus garantir qu'une version syntaxiquement correcte renverrait les mêmes résultats que vous voyez sur MySQL. Regroupement par la même colonne que vous voulez que le MAX est tout à fait bizarre ...

+0

En fait, tous les SGBD sauf MySQL refuseront d'exécuter une telle requête. MySQL renvoie simplement des résultats indéterminés –

+0

En fait, l'instruction était incorrecte, nous n'étions pas regroupés par COLUMN_A mais une autre colonne à la place. En fait ce que nous voulons, c'est ceci SELECT *, MAX(COLUMN_A) FROM table_xyz WHERE COLUMN_A <= 100 GROUP BY COLUMN_B this works but gives us only column A and B SELECT COLUMN_B, MAX(COLUMN_A) FROM table_xyz WHERE COLUMN_A <= 100 GROUP BY COLUMN_B what we want is this, but it doesn't work (group by error) SELECT COLUMN_B, COLUMN_C .... COLUMN_X, MAX(COLUMN_A) FROM table_xyz WHERE COLUMN_A <= 100 GROUP BY COLUMN_B Dave

+0

@a_horse_with_no_name: Non, SQLite supporte la même fonctionnalité de "colonne cachée" que MySQL supporte. Mais toute base de données * réelle *, oui - vous avez raison. :) –

1

Si vous voulez que le max() pour column_a vous n'avez pas besoin du groupe en tout:

 
SELECT MAX(COLUMN_A) 
    FROM table_xyz 
WHERE COLUMN_A <= 100 
0

problèmes multiples. Votre clause GROUP BY est à l'envers. Vous devez définir votre GROUP BY par les colonnes du *. Aussi ce que OMG Ponies a dit avant.

1

En plus de ce que tout le monde dit, Oracle ne permet pas mélanger * avec des définitions de colonnes explicites dans les requêtes:

SQL> select *, table_name from user_tables; 
select *, table_name from user_tables 
     * 
ERROR at line 1: 
ORA-00923: FROM keyword not found where expected 

Oracle n'a même pas regardé le fait que vous essayez d'obtenir des colonnes en dehors de ceux inclus dans la clause group by. Ce que d'autres ont déclaré, Oracle ne le fera pas.

1

Cela ne répond pas à votre problème MAX, mais la seule façon de suivre un '*' avec d'autres colonnes est d'utiliser une référence explicite à un alias de table, par exemple.

SELECT e.*, zip_code 
FROM addresses a, 
     employees e 
WHERE e.addressId = a.Id 

Pour la valeur MAX, vous devrez soit regrouper par toutes les autres colonnes, ou regarder dans les fonctions analytiques (abondance de réponses précédentes de débordement de la pile).

Questions connexes