oracleデータベースに3つの表があります。彼らは、次のようになります。テーブルOrganisation
にテーブルuser
とorganisationname
で同じ名前の列にusername
ポイント:where句でlistaggによって生成された列を使用する
Table User:
username|forename|surname
a a a
b b b
c c c
Table Right:
username|organisationname|right
a x user
a x admin
a x owner
a y user
a y admin
a z owner
b x user
c y user
c y admin
c z user
Table Organisation:
organisationname|number
x 12
y 14
z 42
テーブルRight
は2 FOREIGN_KEYSがあります。
organisation
xに適切なユーザーがいるすべてのuser
については、ユーザーが1つ以上の権利を持っているorganisations
(組織xを除く)すべてのリストを取得したいと考えています。
私の例では、 には正しいユーザーが、bには正しいユーザーが、cには適切なユーザーがいません。 だから、私は、ユーザーaとb(そしてc!ではない)のすべての組織(別名!、組織名2回)を取得したいだけです。 あるユーザーがx以外の組織に権限を持っていない場合(適切なユーザーがいる必要がある場合)、そのユーザーは出力が必要ですが組織はありません。
予想される出力は次のようになります。
user|organisations
a y; z
b
私はあなたが私が何を意味するか理解してほしいです。 私のクエリは、これまでのところ、次のとおりです。
作品を問い合わせたが、今私は、列の組織にフィルタリングするselect username,
/* listagg put all the organisationnames of one user in one column separated by ;
then the organsation x gets removed from the result*/
regexp_replace (listagg (organisationname, '; ')
within group (order by organisationname), '(^x;?)|(?x;)|(; x$) ', '') as "organisations"
from(
select u2.username as username,
o.organisationname as organisationname,
/*I do this to remove duplicate entries in the list of organisations of one user */
row_number() over (partition by u2.username, o.organisationname order by u2.username) as rn
from RIGHT r2, ORGANISATION o, USER u2
where r2.organisationname = o.organisationname
and r2.username = u2.username
and r2.username IN
(
select u.username
from USER u, right r
where r.username = u.username
and r.right = 'user'
)
order by u2.username, o.organisationname
)
where rn = 1
group by username
。しかしwhere句では使用できません。 ORA-00904:無効な識別子
私はこれをどのように達成できるか知っていますか?いいえ、私はそれを使用しようとすると、オラクルには分析関数のリストがあるので問題があると思う。 私はクエリを簡素化する方法の提案もうれしいです。ありがとう!
select * from (***long query shown above***)
where organisations like '%termToSearch%';
また投稿してください、あなたには現在何をしようとしていますか? –
質問の最後にwhere-clauseを付けてクエリを入れます – Markus