1
votes

Requête Oracle pour sélectionner une valeur distincte en fonction d'une autre valeur de colonne

Examinez l'exemple de tableau ci-dessous:

ID    Value
123   ABC
456   DEF

Je veux le résultat de la requête de sélection comme ci-dessous:

ID    Value
123   ABC
456   DEF
456   ABC

Remarque: l'ID n'a que 2 valeurs différentes - "123" et "456". La sélection doit être basée sur la colonne «ID». Si la valeur "123" est présente, les données correspondantes de la colonne "Valeur" doivent être sélectionnées. Sinon, l'ID "456" doit être récupéré.


2 commentaires

publier la valeur réelle de l'ID s'il s'agit d'une chaîne


Que voulez-vous dire par "Si la valeur" 123 "est présente ? Par rapport à quoi? Vous avez dit que l'Id n'a que 123 ou 456, donc il devrait être présent n'est-ce pas?


3 Réponses :


1
votes

un simple group by vous aidera à obtenir le résultat souhaité

select min(id), value
from table
group by value


7 commentaires

Désolé, oubliez de mentionner que l'ID n'est pas un numéro. C'est une chaîne. Donc min (id) n'est pas utile.


@Viswa le convertit en utilisation numérique TO_NUMBER


La fonction min peut être appliquée non seulement pour les nombres.


La fonction min ne fonctionnera pas si 123 est yyy et 456 est xxx


@ psaraj12. . . Ensuite, utilisez max () . Il est seulement possible de répondre à la question qui est posée, et cela semble être la réponse la plus simple.


@GordonLinoff c'est pourquoi j'ai demandé la valeur réelle de l'ID à OP et donné une solution générique


vous laissez les données décider d'utiliser le minimum ou le maximum, ce qui n'est pas une bonne conception



0
votes

Vous pouvez utiliser ce qui suit si l'ID est une chaîne comme 456 est 'xxx' et 123 est 'yyy' Le violon SQL ici

WITH tt1 
     AS (SELECT Decode(id, '123', 1, 
                           2) order1, 
                id, 
                value1 
         FROM   tt), 
     tt2 
     AS (SELECT Min(order1) order1, 
                value1 
         FROM   tt1 
         GROUP  BY value1) 
SELECT tt1.id, 
       tt1.value1 
FROM   tt2, 
       tt1 
WHERE  tt1.value1 = tt2.value1 
       AND tt1.order1 = tt2.order1; 


0 commentaires

0
votes

Quelque chose comme ceci:

    select min(id) as id,
           Value 
    from table
    group by  Value, id


0 commentaires