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é.
veuillez expliquer votre question en détail car elle n'est pas claire pour que l'on puisse répondre. – Salil
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. –
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)? –