2013-05-07 4 views
1

J'ai ces trois tables.Oracle Cross rejoindre

Tableau 1:

Resource1 
Resource2 
Resource3 

Tableau 2:

Period1 
Period2 
Period3 

Table3:

Resource1 Period1 
Resource1 Period2 
Resource1 Period2 
Resource2 Period1 
Resource2 Period1 
Resource3 Period3 

Je dois obtenir ce résultat:

Resource1 Period1 
Resource1 Period2 
Resource1 Period2 
Resource1 Period3 
Resource2 Period1 
Resource2 Period1 
Resource2 Period2 
Resource2 Period3 
Resource3 Period3 
Resource3 Period1 
Resource3 Period2 

J'ai essayé des jointures externes mais aucun effet. J'ai trouvé que probablement rejoindre rejoindre devrait aider, mais je n'ai pas réussi à l'implémenter. Pourrait être quelqu'un si gentil et m'aider avec ce genre de choses? Merci beaucoup, r.

+1

Pourriez-vous expliquer les règles de création de votre jeu de résultats? Que voulez-vous dire par "rangs inutiles"? –

+0

Je suis désolé pour la confusion. Je vais supprimer note sur les lignes inutiles de la description, en ce moment. Les règles sont les suivantes: Le tableau 1 contient toutes les ressources. Le tableau 2 contient toutes les périodes ouvertes dans le système. Le tableau 3 contient des ressources qui ont créé quelque chose dans une période donnée. (les doublons sont possibles) Chaque ressource doit avoir toutes les périodes ouvertes mentionnées avec son nom ET s'il a déjà dans le Tableau 3 mentionné une période ouverte quel que soit le nombre de fois, ces données doivent également être présentes. Donc le résultat: les doublons de Table3 devraient être là et quand certaines des périodes ouvertes de Table2 sont manquantes, elles devraient être là aussi). – roxor

Répondre

1

utiliser une expression de table commune pour générer toutes les combinaisons, puis utilisez un externe joindre pour inclure les doublons montrés dans table3.

with cte as (select resource, period 
       from table1 cross join table2) 
select cte.resource 
     , cte.period 
from cte 
    left outer join table3 
      on (table3.resource = cte.resource 
      and table3.period = cte.period) 
; 

Cela peut ne pas produire la bonne réponse, en fonction de ce que vous entendez par « Je ne sais pas comment se débarrasser de lignes unneccessary ». La sortie que vous présentez ne semble pas ignorer les lignes des tables et vous n'avez fourni aucune règle. Donc, si cela ne vous donne pas ce que vous voulez, vous devez éditer votre question pour clarifier les choses.

+0

Vous n'avez pas nécessairement besoin d'un CTE mais je pense que cette réponse permet d'obtenir le résultat souhaité. –

+1

@ypercube - Je suis d'accord que la clause WITH n'est pas obligatoire mais je les aime parce qu'ils peuvent aider à clarifier la structure d'une requête. – APC

+0

Cela fonctionne exactement ce dont j'avais besoin! Maintenant, je peux voir pourquoi mes solutions étaient toutes mauvaises. Il me manquait toujours cette deuxième condition: et table3.period = cte.period Merci beaucoup. – roxor

0

Je reçois le résultat, mais je ne suis pas sûr que ma pensée est juste ou non ..

SELECT A.RESOURCEID,B.PERIOD 
FROM 
TABLE1 A CROSS JOIN TABLE2 B 
UNION ALL 
SELECT RESOURCEID,PERIOD 
FROM TABLE3 C 
GROUP BY RESOURCEID,PERIOD 
HAVING COUNT(*)>1 

http://www.sqlfiddle.com/#!4/36667/2

+0

que sqlfiddle.com est grand, merci de partager cette année – roxor

+0

@roxor, c'est vraiment pratique, je l'ai aussi trouvé des autres ici:). – Gentlezerg