2010-08-06 3 views
1

Je génère des images à partir d'un original et les stocke dans un tableau. Je veux une requête qui va vérifier les lacunes.Rechercher des enregistrements "manquants" dans un tableau de pont/de données croisées

Les tailles d'image sont conservées dans une troisième table et chaque original doit avoir une image générée pour chaque enregistrement de la table de types.

Où est ce que j'ai jusqu'à présent:

SELECT oi.OriginalImageID, it.ImageTypeID 
FROM dbo.OriginalImages AS oi 
CROSS JOIN 
     dbo.ImageType AS it 
LEFT OUTER JOIN 
      (
      SELECT oi2.OriginalImageID, it2.ImageTypeID 
      FROM dbo.OriginalImages AS oi2 
      INNER JOIN 
        dbo.GeneratedImages AS gi2 ON gi2.OriginalImageID = oi2.OriginalImageID 
      INNER JOIN 
        dbo.ImageType AS it2 ON it2.ImageTypeID = gi2.ImageTypeID 
      ) AS sub ON sub.OriginalImageID = oi.OriginalImageID 
         AND sub.ImageTypeID = it.ImageTypeID 
WHERE (sub.OriginalImageID IS NULL) 

Ce qui fonctionne, mais il semble très laid. Je me demande s'il y a une façon plus élégante de le faire.

Les tableaux ressemblent essentiellement à ceci:

OriginalImages 
    OriginalImageID (PK) 
    Image 

GeneratedImages 
    OriginalImageID (FK) 
    ImageTypeID (FK) 
    Image 

ImageType 
    ImageTypeID (PK) 
    Description 

Répondre

3

Vous devriez être en mesure de simplifier votre requête existante à:

SELECT oi.OriginalImageID, it.ImageTypeID 
FROM dbo.OriginalImages AS oi 
CROSS JOIN 
     dbo.ImageType AS it 
LEFT OUTER JOIN 
     dbo.GeneratedImages AS gi2 
     ON gi2.OriginalImageID = oi.OriginalImageID AND 
     gi2.ImageTypeID = it.ImageTypeID 
WHERE gi2.OriginalImageID IS NULL 

Bien que personnellement, j'utiliser un PAS EXISTE:

SELECT oi.OriginalImageID, it.ImageTypeID 
FROM dbo.OriginalImages AS oi 
CROSS JOIN 
     dbo.ImageType AS it 
WHERE NOT EXISTS 
     (SELECT NULL FROM dbo.GeneratedImages AS gi2 
     WHERE gi2.OriginalImageID = oi.OriginalImageID AND 
       gi2.ImageTypeID = it.ImageTypeID) 

(Modifié à la suite du commentaire.)

+0

hum, non. J'obtiens les enregistrements dont j'ai besoin de la requête originale. mais n'obtenant aucun résultat de l'un ou l'autre. Actuellement, il y a 4 "types" donc SELECT NULL FROM dbo.GeneratedImages AS gi2 WHERE gi2.OriginalImageID = oi.OriginalImageID ne renverra pas de null s'il y a même un type dans la table GeneratedImages. –

+0

@Dan - Oups, j'ai raté une partie importante de la jointure - essayez les requêtes mises à jour. –

+0

Chaud! Merci pour l'aide, souhaite que je pourrais upvote deux fois! –

Questions connexes