2013-05-07 3 views
1

У меня эти три таблицы.Oracle Cross join

Table1:

Resource1 
Resource2 
Resource3 

Table2:

Period1 
Period2 
Period3 

Таблица3:

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

Мне нужно, чтобы получить этот результат:

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

Я пробовал внешние соединения, но никакого эффекта. Я обнаружил, что, вероятно, кросс-соединение должно помочь, но я не был успешным в его реализации. Может быть, кто-то такой добрый и помог мне с этим?

спасибо, r.

+1

Не могли бы вы объяснить правила создания набора результатов? Что вы подразумеваете под «ненужными строками»? –

+0

Прошу прощения за путаницу. Прямо сейчас я удалю примечание о ненужных строках из описания. Правила: Таблица 1 содержит все ресурсы. Таблица 2 содержит все открытые периоды в системе. Таблица 3 содержит ресурсы, которые сделали что-то определенное время. (возможны дубликаты) Каждый ресурс должен иметь все открытые периоды, упомянутые с его именем. И если он уже имеет в Таблице 3 упоминание открытого периода независимо от того, сколько раз, эти данные также должны быть там. Итак, результат: дубликаты из Таблицы 3 должны быть там, и когда некоторые из открытых периодов из Таблицы 2 отсутствуют, они также должны быть там). – roxor

ответ

1

использовать общее табличное выражение, чтобы генерировать все комбинации, а затем использовать внешнее чтобы включить дубликаты, указанные в 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) 
; 

Это может не правильный ответ, в зависимости от того, что вы имеете в виду «я не знаю, как избавиться от строк ненужных». Представленный вами вывод не отображает любые строк из таблиц, и вы не указали никаких правил. Итак, если это не дает вам то, что вы хотите, вы должны изменить свой вопрос, чтобы прояснить ситуацию.

+0

Вам не обязательно нужен CTE, но я думаю, что этот ответ поймает желаемый результат. –

+1

@ypercube - Я согласен, что предложение WITH не является обязательным, но мне они нравятся, потому что они могут помочь прояснить структуру запроса. – APC

+0

Он работает именно так, что мне нужно! Теперь я понимаю, почему мои решения были плохими. Мне всегда не хватало этого второго условия: и table3.period = cte.period Большое спасибо. – roxor

0

я получить результат, но я не уверен, является ли моя мысль правильно или нет ..

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

, что sqlfiddle.com замечательно, так что вы можете поделиться этим – roxor

+0

@roxor year, это действительно удобно, я также нашел его от других здесь:). – Gentlezerg

Смежные вопросы