2010-04-14 7 views
3

Mes compétences de recherche google m'ont échoué, et je ne suis pas un expert en base de données par tous les moyens! J'ai un schéma de base de données très simple qui ressemble à ceci:Création d'une vue de base de données avec logique booléenne

database schema http://bit.ly/adeUVL

properties_id dans la table de CANDY est une clé étrangère id dans la table EXPENSIVE_PROPERTIES. Le properties_id est seulement défini si le bonbon est cher. S'il est cher, les valeurs correspondantes dans la table EXPENSIVE_PROPERTIES vont se remplir

Quand je veux obtenir une liste des bonbons, je veux essentiellement le faire.

  • demande tous les propriétés dans la table de CANDY, comme le nom et la couleur
  • en option obtenir les propriétés coûteuses si la valeur properties_id est non nul

dans le passé, je l'ai fait deux requêtes, mais cela est stupide puisque je devrais pouvoir pour créer une vue qui agrègent es toutes les propriétés dans une table et laisse simplement les autres champs vides s'il n'y a pas d'identifiant correspondant dans la table EXPENSIVE_PROPERTIES.

Quelqu'un peut-il me dire comment créer cette vue dans SQLite? Je suppose qu'il est possible, mais je ne pouvais pas comprendre from the docs:

alt text

Le SINON EXISTE éléments ne semblent pas avoir quelque chose à voir avec l'existence d'une valeur de champ particulier.

MISE À JOUR

La question a été répondu, mais une chose que je trouve étrange est que, dans certains cas, je vois des entrées en double. J'utilise SQLite Administrator, et quand j'exécute l'instruction CREATE VIEW et que je regarde dans l'onglet résultats, j'obtiens des entrées uniques. Si je fais juste une instruction SELECT, j'obtiens des lignes en double. Si je crée la vue, puis faites un SELECT * FROM myview; Je vois aussi des lignes en double. Quelqu'un peut-il nous éclairer là-dessus? Devrais-je créer une nouvelle question?

MISE À JOUR # 2

Peu importe, je trouve mon erreur - j'avais deux tables après FROM, ce qui provoque la duplication.

Répondre

3

Vous pouvez utiliser LEFT OUTER JOIN pour récupérer des données d'une autre table qui peut ne pas avoir de données pour certaines lignes de votre table principale.

create view vCandy as 
select c.id, c.name, c.color, c.properties, 
ep.chocolate, ep.gold_foil 
from Candy c 
left outer join Expensive_Properties ep on c.properties_id = ep.id 

Le IF NOT EXISTS ne se réfère pas à traiter des données qui n'existent pas. Au contraire, cela signifie qu'il va créer la vue si elle n'existe pas déjà. Cela permet d'éviter les erreurs lors de l'exécution de l'instruction plusieurs fois.

+0

ok, je vais essayer maintenant. Merci! Je n'avais pas utilisé de jointure externe avant. – Dave

+0

qui a fonctionné !!! Je vous remercie. – Dave

+0

encore une question - bien que cela fonctionne, pourquoi l'utilisation d'une seule instruction SELECT (sans création de vue) se termine par des lignes dupliquées dans les résultats? – Dave

1

Je ne suis pas familier avec SQLite, mais sinon il y aura un besoin de LEFT OUTER JOIN:

SELECT * FROM candy c 
    LEFT OUTER JOIN expensive_properties ep ON c.id = ep.id 
WHERE [your criteria] 

Cela sélectionnera tout assorti et laissera NULLs pour ep * qui n'existent pas. la table CANDY.

2

Vous souhaitez effectuer une jointure gauche dans votre vue. Cela ramènera tout de la première table dans la jointure et tout de la deuxième table qui correspond. Si rien ne correspond (le bonbon n'est pas cher), les champs de la seconde table seront nuls.

select * from extérieur gauche de bonbons rejoindre expensive_properties sur candy.id = expensive_properties.id

+0

+1 pour une autre bonne réponse! – Dave