2010-04-05 3 views
2

Je souhaite créer une vue dans une relation un-à-plusieurs. Voici mes relations:sql créer une vue dans une relation à plusieurs

(a -* b) 
(a -* c) 

Je veux créer une vue d'avoir ces données:

  • a1 - (Reliée aux tout b a1 + tous c est lié à a1)

Je ne veux pas quelque chose comme (a1, b1, c1 - a1, b1, c2, ...). Je veux que les données soient:

(ID, DESCRIPTION1, Description2, description3)

dans un enregistrement.

Par exemple, si dans le tableau I a ai données: (1,2,3)

et dans le tableau I b ai (10,11,12 avec fk à 1 et dans un 20,21,22 avec fk à deux en a)

et dans le tableau I c ai (100101102 avec fk à 1 en a)

Je veux résulter de ce type dans une ligne:

1,10,11,12,100,101,102 pour 1

et quelque chose comme ceci pour 2, 3, ...

je pense que j'ai besoin de "exemple de sous-requête de rangée simple" mais je ne peux trouver aucun exemple, pouvez-vous m'aider plz?

Comment puis-je créer cette vue?

+1

veuillez expliquer votre question en détail car elle n'est pas claire pour que l'on puisse répondre. – Salil

+0

La notation utilisée pour décrire les relations n'est pas standard - je suppose que cela signifie que vous avez une relation A qui a une relation un-à-plusieurs avec des lignes dans la relation B, et qui a aussi une relation un-à-plusieurs séparée avec les lignes en relation C. La relation de résultat (vue) devrait idéalement avoir une ligne pour chaque élément dans A, avec les lignes correspondantes de B et les lignes correspondantes de C - mais il ne devrait pas y avoir un produit cartésien des lignes dans B et C wrt la ligne dans A. Mais vous devez utiliser plus de mots pour expliquer que c'est ce que vous voulez. –

+0

Le problème avec ce que vous voulez est que le jeu de résultats puisse avoir un nombre variable de colonnes par ligne en fonction du nombre de lignes dans B et C correspondent à chaque ligne dans A. Y aura-t-il toujours plus de 3 lignes dans B par clé UNE? Y aura-t-il toujours plus de 3 lignes en C par clé dans A? Si c'est le cas, l'ensemble de résultats peut avoir 7 colonnes (A1, B1, B2, B3, C1, C2, C3) avec des valeurs NULL pour certaines colonnes, par ex. (2, 20, 21, 22, NULL, NULL, NULL)? –

Répondre

1

Comme noté dans un commentaire que j'ai fait, la notation utilisée pour décrire les relations n'est pas standard.

Je pense que cela signifie que vous avez une relation A qui a un à plusieurs avec des lignes en relation avec B, et qui a également un à plusieurs avec des lignes séparées relation en relation avec C.

La relation de résultat (la vue) devrait idéalement avoir une ligne pour chaque élément dans A, avec les lignes correspondantes de B et les lignes correspondantes de C - mais il ne devrait pas y avoir un produit cartésien des lignes dans B et C par rapport au rangée A.

Je suppose que vos relations sont:

A(A1, A2, A3) - Primary Key (A1) 
B(B1, B2, B3) - Foreign Key (B1) References A(A1) 
C(C1, C2, C3) - Foreign Key (C1) References A(A1) 

Si vous suivez les vues de C J Date, vous avez besoin d'une vue avec une paire d'attributs RVA - relation-value. C'est-à-dire, vous auriez une structure de table analogue à:

+------+------+------+------------------+-----------------+ 
|  |  |  | +------+------+ | +------+------+ | 
| A1 | A2 | A3 | | B2 | B3 | | | C2 | C3 | | 
|  |  |  | +------+------+ | +------+------+ | 
+------+------+------+------------------+-----------------+ 
|  |  |  | +------+------+ | +------+------+ | 
|  |  |  | | b21 | b31 | | | c42 | c13 | | 
| a11 | a21 | a31 | | b22 | b32 | | | c52 | c23 | | 
|  |  |  | | b23 | b33 | | | c62 | c13 | | 
|  |  |  | |  |  | | | c72 | c23 | | 
|  |  |  | +------+------+ | +------+------+ | 
+------+------+------+------------------+-----------------+ 

Ceci est une manière très soignée de représenter ce que vous recherchez. Malheureusement, AFAIK, SQL ne supporte pas cette notation.L'approche la plus proche est susceptible d'être deux jointures externes indépendantes, qui tend à générer beaucoup de lignes (12 dans l'exemple):

SELECT A.A1, A.A2, A.A3, B.B2, B.B3, C.C2, C.C3 
    FROM A LEFT OUTER JOIN B ON A.A1 = B.B1 
     LEFT OUTER JOIN C ON A.A1 = C.C1 

Vous dites:

Je veux des données à être:

(ID, DESCRIPTION1, Description2, Description3)

dans une fiche.

Par exemple, si dans le tableau I a ai données: (1,2,3)

et dans le tableau I b ai (10,11,12 avec fk à 1 et dans un 20,21,22 avec fk à deux en a)

et dans le tableau I c ai (100101102 avec fk à 1 en a)

Je veux résulter de ce type dans une ligne:

1,10,11,12,100,101,102 pour 1

Vous voulez une vue avec 4 colonnes selon l'instruction "Je veux que les données soient", mais le résultat affiché montre 7 valeurs - car il y a trois enregistrements dans B correspondant à l'enregistrement avec un ID de 1 dans A , et de même parce qu'il y a trois enregistrements en C aussi. On ne sait pas quelle valeur était dans la Description1 de A - il semble manquer. Combien de colonnes voulez-vous s'il y avait 6 rangées dans B et 10 dans C qui correspondaient à la rangée 1 dans A? Et comment cela se rapporte au nombre de colonnes pour l'enregistrement avec l'ID 2 dans A (avec 4 lignes dans B et 3 lignes dans C qui correspondent)?

Si vous avez demandé un résultat comme:

1,Note1,{10,11,12},{100,101,102} 

où les accolades entourent une liste de quelque sorte, votre résultat a en effet obtenu quatre colonnes. En outre, si votre SGBD prend en charge une opération GROUP_CONCAT, vous pouvez même écrire une requête qui produit le résultat.

Vous apprendrez que si vous n'exprimez pas les exigences de votre requête avec précision, vous obtenez des résultats quasi-aléatoires - ou des résultats autres que ce que vous vouliez vraiment, en tout cas. Lorsque les exigences de la requête sont exprimées avec précision, l'ensemble du processus est beaucoup plus facile.

Dans les systèmes qui prennent en charge GROUP_CONCAT, vous obtiendrez une liste à l'aide:

SELECT B.ID, GROUP_CONCAT(B.Description2) AS Description2 
    FROM B 
GROUP BY B.ID 

Vous puis rédigez votre question globale joignant deux de ces expressions à A:

SELECT A1.ID, A1.Description AS Description1, 
     B2.Description2, C3.Description3 
    FROM A AS A1 LEFT OUTER JOIN 
     (SELECT B.ID, GROUP_CONCAT(B.Description) AS Description2 
      FROM B 
     GROUP BY B.ID) AS B2 ON A1.ID = B2.ID 
     LEFT OUTER JOIN 
     (SELECT C.ID, GROUP_CONCAT(C.Description) AS Description3 
      FROM C 
     GROUP BY C.ID) AS C3 ON A1.ID = C3.ID 

Pour faire cela en une vue, appliquez le préfixe 'CREATE VIEW' approprié.

+0

tnx pour votre aide! il fait ce que je veux. mais il crée tous les résultats dans un blob puis-je obtenir des données sans type de Blob? –

+0

@new to sql: Vous devrez déterminer quel type de données vous voulez et comment l'obtenir. Je suppose que vous avez MySQL puisque vous semblez avoir GROUP_CONCAT. En passant, je ne pense pas que MySQL supporte les types ARRAY ou LIST pour les colonnes (et encore moins les RVA). –

Questions connexes