1
votes

Sélection de lignes qui n'ont qu'une seule relation unique entre deux colonnes SGBD SQL

J'essaie d'écrire une seule requête pour sélectionner toutes les lignes qui ont une relation unique entre deux colonnes.

par exemple:

1   2   3   4
-------------
a   t   g   1
a   f   d   1
b   h   l   2
b   r   g   2
b   q   m   3

Ici, je ' Je ne regarde que les colonnes 1 et 4.

Dans ce tableau, je voudrais sélectionner les lignes 1 et 2 car dans les deux, colonne 1 = a et colonne 4 = 1. en d'autres termes, chaque le moment où a apparaît dans la colonne un, 1 apparaît dans la colonne quatre. Je ne voudrais pas sélectionner de lignes contenant b pour la colonne 1 car les valeurs correspondantes pour la colonne 4 pourraient être 2 ou 3.

sql

2 commentaires

La table est si grande que je ne peux pas rechercher des occurrences spécifiques. J'ai besoin d'écrire une requête pour sélectionner le moment où la condition décrite ci-dessus se produit. De plus, avec cette logique, "where col1 = 'b' and col4 = '2'" renverrait des lignes que je ne veux pas car il y a une ligne où col1 = b et col4 = 3.


Je pense que ce que vous voulez, c'est une liste de ces lignes, où la valeur de la colonne 4 ne dépend que de la valeur de la colonne 1 .


3 Réponses :


0
votes

Je suppose que c'est ce que vous voulez:

select *
from my_table
where "1" in (
  select c1
  from (
    select "1" as c1, count("4") as cnt
    from my_table
    group by "1" -- fixed here.
    having count("4") > 1
  ) x
  group by c1
  having count(cnt) = 1 -- this is the key condition.
)

Étant donné que les noms de vos colonnes ne commencent pas par une lettre, la plupart des bases de données les accepteront si vous les mettez entre guillemets ( " ), comme je l'ai fait.


2 commentaires

im obtenant une erreur qui dit "1" doit apparaître dans la clause group by. Mes colonnes dans la base de données sont basées sur des lettres. Je viens d'utiliser des chiffres à des fins de publication


Oui, corrigé maintenant.



1
votes

Vous pouvez facilement obtenir les valeurs de la colonne 1 qui répondent à vos besoins avec cette requête:

SELECT *
FROM mytable
WHERE col1 IN 
(
    SELECT col1
    FROM mytable
    GROUP BY col1
    HAVING COUNT(DISTINCT col4) = 1
)

Votre requête finale serait donc:

SELECT col1
FROM mytable
GROUP BY col1
HAVING COUNT(DISTINCT col4) = 1


0 commentaires

0
votes

Si vous voulez sélectionner les lignes réelles, puis utilisez n'existe pas :

select t.*
from t
where not exists (select 1 from t t2 where t2.c1 = t.c1 and t2.c4 <> t.c4);

Si vous voulez juste les valeurs de c1 alors utilisez group by comme suggéré par d'autres réponses.


0 commentaires