2009-05-13 7 views
0

Je veux choisir tblProperty.ID que lorsque cette requête renvoie supérieure à 0SQL question sous-requêtes

SELECT  
    COUNT(tblProperty.ID) AS count 
FROM   
    tblTenant AS tblTenant 
    INNER JOIN tblRentalUnit 
     ON tblTenant.UnitID = tblRentalUnit.ID 
    INNER JOIN tblProperty 
     ON tblTenant.PropertyID = tblProperty.ID 
     AND tblRentalUnit.PropertyID = tblProperty.ID 
WHERE tblProperty.ID = x 

où x est égal à tblProperty.ID du parent qu'il regarde. Je ne sais pas ce que 'x' est.

Comment est-ce que je peux faire ceci?

Database Structure: 
tblTenant: 
    ID 
    PropertyID <--foreign key to tblProperty 
    UnitID  <--foreign key to tblRentalUnit 
    Other Data 
tblProperty: 
    ID 
    Other Data 
tblRentalUnit: 
    ID 
    PropertyID <--foreign key to tblProperty 
    Other Data 

Explication de la requête:
La requête est sélectionnez uniquement les propriétés qui ont des logements locatifs qui ont des locataires qui y vivent.

+0

Pourquoi vous aliasing toutes vos tables avec le même nom qu'ils ont déjà? N'est-ce pas un peu hors sujet? :) – Tomalak

+0

Lorsque vous posez ce genre de questions, il peut être bon de savoir comment vos tables et vos relations sont établies, parce que juste un coup d'oeil rapide à cela, je dirais que vous n'obtiendrez pas plus d'un résultat parce que vous re le limitant à un seul identifiant de propriété (X). Plus encore ... pourquoi ne pas simplement inclure le PropertyID quand il ne renvoie qu'un seul résultat? Il semble que vous essayez de rendre cette requête trop compliquée. – TheTXI

+0

@Tomalak Je ne l'ai pas fait, Crystal Reports l'a fait. Je l'ai juste laissé comme ça. – Malfist

Répondre

3
SELECT  
    tblProperty.ID 
FROM   
    tblTenant AS tblTenant 
    INNER JOIN tblRentalUnit AS tblRentalUnit 
     ON tblTenant.UnitID = tblRentalUnit.ID 
    INNER JOIN tblProperty AS tblProperty 
     ON tblTenant.PropertyID = tblProperty.ID 
     AND tblRentalUnit.PropertyID = tblProperty.ID 
GROUP BY tblProperty.ID 
HAVING COUNT(tblProperty.ID) > 1 

Devrait fonctionner.

+0

Qu'est-ce que je remplace avec 'x'? – Malfist

+0

Si je comprends bien, vous avez besoin d'un groupe d'ici là. Vous voulez seulement les groupes (groupés par tblProperty.id) qui ont un nombre de plus de 1. – pgb

+0

En fait, j'ai trouvé une solution beaucoup plus simple. Posté dans le commentaire suivant – Malfist

0

Clause GROUP BY, peut-être? Sélectionnez dans une table temporaire & puis SELECT à partir de #tmp, si c'est plus facile.

1

Ajoutez ce qui suit à la fin de la requête. Cela suppose que vous ne voulez pas quoi que ce soit pour revenir si le compte est 1 ou 0.

HAVING COUNT(tblProperty.ID) > 1 
0

ce que sur le changement du début à SELECT tblProperty.ID et ajouter à la fin HAVING COUNT(tblProperty.ID) > 1? Bien que je dois admettre que je ne comprends pas vos AS clauses - ils semblent totalement redondants pour moi, chacun ...

+0

sauf le comte, les rapports de cristal l'ont fait pour moi et je ne les ai jamais sortis. – Malfist

2

La requête est: sélectionnez uniquement les propriétés qui ont des logements locatifs qui ont des locataires vivant dans leur.

SELECT 
    p.ID 
FROM 
    tblProperty    AS p 
    INNER JOIN tblRentalUnit AS u ON u.PropertyID = p.ID 
    INNER JOIN tblTenant  AS t ON t.UnitID  = u.ID 
GROUP BY 
    p.ID 

Cela devrait le faire. Les jointures internes explicitement et non sélectionnent les enregistrements non référencés, ce qui signifie que seules les propriétés ayant des locataires ayant des locataires sont sélectionnées. Je ne sais pas pourquoi vos liens tblTenant à tblProperty. Il semble que ce n'était pas nécessaire, car le lien semble aller de locataire-> unité de location-> propriété.

+0

Cela fonctionne également. – Malfist

0

En fait, cela fonctionne:

SELECT DISTINCT 
    p.ID 
FROM   tblProperty AS p LEFT OUTER JOIN 
         tblTenant AS t ON t.PropertyID = p.ID 
WHERE  (t.UnitID IS NOT NULL) 
+0

Pourriez-vous vérifier que ma requête fonctionne également? Et donner une réponse à la question que j'ai au sujet de votre mise en page de données? Merci :) – Tomalak

+0

N'a pas donné de réponse parce que vous n'étiez pas le premier. Mais je vous ai donné un upvote mérité :) – Malfist

+0

Vous comprenez que c'est une mauvaise solution, non? Si vous utilisez une jointure à gauche, vous l'annulez complètement en plaçant une référence à cette table dans la clause where sauf si vous demandez des instances où l'identifiant est nul (ce qui vous donne des enregistrements dans la première table et non dans la seconde). Donc, une jointure interne serait mieux pour la performance ainsi que plus simple. Aussi, avez-vous vraiment des locataires qui vivent dans plus d'une propriété? Sinon, vous n'avez pas besoin de perdre du temps avec un distinct non plus. – HLGEM