2010-06-30 4 views
2

Désolé pour avoir posté cette question à nouveau. J'ai reformulé ma question un peu.Aide sur la requête SQL

J'essaie d'écrire une requête pour retourner les lignes de la table A où plusieurs lignes trouvées dans la table B avec STATUS = 1 pour chaque colonne CID de la table A. Donc, dans cet exemple, le CID 100 a deux enregistrements trouvés dans la table B et STATUS = 1. Je veux donc écrire une requête pour retourner cette ligne de la table A. Je sais que c'est un design de table bizarre. S'il vous plaît aider.

Voici les tableaux avec des exemples de données.

Table-A 

----------------------------------------- 
AID    Name   CID 
--------------------------------------- 
10    test1   100  
12    test1   100 
13    test2   101 
14    test2   101 
15    test3   102 


Table-B 
------------------------------------ 
bID    AID   status 
----------------------------------- 
1     10    1 
2     12    1 
3     14    1 
4     15    1 
+1

type de base de données et la version? –

+1

votre formulation me confond vraiment! – JohnB

+0

"Je souhaite écrire une requête pour renvoyer cette ligne de la table A." Vous venez de dire qu'il y avait deux rangées ... Lequel de ces deux lignes voulez-vous dire quand vous dites 'cette' rangée? –

Répondre

1

Essayez cette requête:

SELECT TableA.CID 
FROM TableA 
JOIN TableB ON TableA.AID = TableB.AID 
WHERE TableB.status = 1 
GROUP BY TableA.CID 
HAVING COUNT(*) > 1 

Il retourne 100 pour vos données d'exemple.

+0

Merci Mark. Ça marche. Je voudrais retourner toutes les colonnes de TableA. Donc, j'enveloppé cette requête avec Select * from tableA où CID (SELECT TableA.CID DE TableA REJOIGNEZ TableB SUR TableA.AID = TableB.AID OÙ TableB.status = 1 GROUP BY TableA.CID de HAVING COUNT (*)> 1) – nav100

+0

Vous ne pouvez pas faire une jointure dans la clause WHERE? Je trouve cela plus lisible: sélectionnez a. * À partir de la tableAa, tableBb où a.aid = b.aid et b.status = 1 groupe par un.cid ayant un compte (*)> 1 Il devrait aussi y avoir un FK sur le champ AID dans la tableB – SWD

+0

@SWD: Voir cette question connexe: http://stackoverflow.com/questions/1018822/inner-join-versus-where-clause-any-difference –

0

Quelque chose comme ça?

select aid, 
     status 
from (select aid, 
      count(*) as cnt 
     from tableA 
     group by aid) as aggregated 
left join tableB on tableB.aid = aggregated.aid 
where aggregated.cnt > 1 
0

si vous utilisez SQL:

WITH tableBView AS 
(
    SELECT AID AS xxxAID 
    FROM [Table-B] 
    WHERE status = 1 
    GROUP BY AID 
    HAVING COUNT(*) > 0 
) 
SELECT * 
FROM [Table-A] 
WHERE EXISTS (SELECT * FROM tableBView WHERE xxxAID = AID) 
0
SELECT * 
FROM Table-A a 
WHERE a.CID IN 
    (
    SELECT a.CID FROM Table-A a JOIN Table-B b USING (AID) 
    GROUP BY a.CID 
    WHERE b.status = 1 
    HAVING count(*) > 1 
    ) 
0

Ceci est un moyen très bavard de le faire.

Sélectionne toutes les colonnes de Table-A sur les lignes où AID correspondance entre Table-A et Table-B et plus d'une rangée ayant le même CID existe dans Table-A : (BTW, je ne voudrais pas utiliser "-" dans votre table/noms de colonnes Utilisez "_" au lieu..)

select 
derived_table.AID, 
derived_table.Name, 
derived_table.CID 
from 
(select 
    table_A.AID, 
    table_A.Name, 
    table_A.CID, 
    count(table_A.CID) c 
from 
    Table_A 
    inner join Table_B on (Table_A.AID = table_B.AID) 
group by table_A.CID 
) derived_table 
where 
    c > 1