[seasar-dotnet:1865] Re: [DBFlute.NET]業務的one-to-oneな条件に他テーブルのカラム値指定

kubo [E-MAIL ADDRESS DELETED]
2010年 10月 11日 (月) 22:37:42 JST


久保(jflute)です。

fpさん、もうちょっとアドバイス頂ければと思います。
定義した業務的one-to-oneの foreignTable を経由した
さらなる foreignTable のカラムを fixedCondition に
利用するパターンですが、二つの left outer join が、
互いに参照し合うのでSQL的に動作するのかどうか、
ちょっと疑問に思っています。

local = MEMBER
foreign = MEMBER_LOGIN (業務的one-to-one)
foreignのforeign = MEMBER_STATUS (LOGIN経由)

select ...
  from member dflocal
    left outer join MEMBER_STATUS dfrelation_4_1
      on dfrelation_4.LOGIN_MEMBER_STATUS_CODE =
dfrelation_4_1.MEMBER_STATUS_CODE
    left outer join MEMBER_LOGIN dfrelation_4
      on dflocal.MEMBER_ID = dfrelation_4.MEMBER_ID
     and dfrelation_4_1.DISPLAY_ORDER = 2

だと、MEMBER_STATUS の left outer join が先に来て、
dfrelation_4 が(まだ)解決できません。順番を逆にしても:

select ...
  from member dflocal
    left outer join MEMBER_LOGIN dfrelation_4
      on dflocal.MEMBER_ID = dfrelation_4.MEMBER_ID
     and dfrelation_4_1.DISPLAY_ORDER = 2
    left outer join MEMBER_STATUS dfrelation_4_1
      on dfrelation_4.LOGIN_MEMBER_STATUS_CODE =
dfrelation_4_1.MEMBER_STATUS_CODE

今度は、MEMBER_LOGIN の on 句で、
dfrelation_4_1 が解決できません。
MySQLとPostgreSQLで実際に試してエラーになりました。

頭の中でいけるかなぁと勝手に思っていはいたのですが、
いざやってみると確かに...。
ちょっと自分が勘違いしているかもしれません。
fpさんのところで実業務で想定しているパターンを
もう少し情報頂けないでしょうか?
(どういうSQLを想定されていますでしょうか!?)

#
# 以下のようにすれば、いけそうですが、
# 同名カラムをどう解決したものかってとこですね...
#

select *
  from member dflocal
    left outer join
      (select *
         from MEMBER_LOGIN
         left outer join MEMBER_STATUS dfrelation_4_1
           on MEMBER_LOGIN.LOGIN_MEMBER_STATUS_CODE =
dfrelation_4_1.MEMBER_STATUS_CODE
      ) dfrelation_4
      on dflocal.MEMBER_ID = dfrelation_4.MEMBER_ID
     and dfrelation_4.DISPLAY_ORDER = 2


2010/10/11 fp <[E-MAIL ADDRESS DELETED]>:
> fpです。
>
> ありがとうございます。
>
> 申し訳ありませんが、宜しくお願いします。
>
> (2010/10/11 18:46), kubo wrote:
>> 久保(jflute)です。
>>
>>> 当方のプロジェクトでは、話に出た全パターン当てはまります。
>> なるほどー、じゃあ頑張りますよぅ。
>> こっちも「すぐに使ってもらえないかもしれない機能」を
>> 実装するのはリスクがあって、すぐに確認・実践してもらえる
>> ことで、要件に合った仕様と品質を担保してから公開できるので。
>> (なので、大分安定を重視する時期に来たDBFluteでは要件のない
>> 機能はあえて実装せずに将来の機会を待つこともあります、
>> 今回のパターンはそのつもりでした...)
>> もちろん、実現コストに全て委ねられますが、あともうちょい頑張れば
>> できそうなので。(フィルタ処理はコールバックで遅延させます)
>>
>> 2010/10/11 fp<[E-MAIL ADDRESS DELETED]>:
>>> fpです。
>>>
>>> 久保さん、ありがとうございます。
>>>
>>> 当方のプロジェクトでは、話に出た全パターン当てはまります。
>>>
>>> ただ、無理なようでしたら機能制限の範囲内で回避策を
>>> 考えますので、それほど緊急とはお考えにならないで下さい。
>>>
>>>
>>>
>>> すれちがってしまいましたね。>[seasar-dotnet:1861]
>>>
>>>
>>> (2010/10/11 18:26), kubo wrote:
>>>> 久保(jflute)です。
>>>>
>>>> ああ、なるほど、業務的one-to-oneのリレーションを
>>>> 通過した先の foreignTable のことですね。
>>>> しかも、今の仕様だと辿るリレーションの中で、
>>>> 業務的one-to-oneを含めることができないので、
>>>> 参照元テーブルから辿ることもできないですね。
>>>>
>>>> 業務的one-to-oneの参照先テーブルだけは特別に、
>>>> ポイントとして指定できる唯一の foreignTable、
>>>> もしくは、リレーションで特別に辿れる業務的one-to-one
>>>> というように扱えればってところですね。
>>>>
>>>> $$over(MEMBER_LOGIN.memberStatus)$$
>>>>
>>>>     もしくは
>>>>
>>>> $$over(MEMBER.memberLoginAsValid.memberStatus)$$
>>>>
>>>> 該当の業務的one-to-oneが確定していない時点で、その奥の
>>>> リレーションを有効にしてエリアス名を取得できるかどうか、
>>>> その辺が実現の鍵になるので、ちょっと考えますね。
>>>> (場合に寄っては、置換処理をコールバックで遅延させて
>>>> 実行させるなどの工夫が必要かも...)
>>>>
>>>> ちなみに、fp さんの業務の中で、このパターンに
>>>> 当てはまるものがありますでしょうか?
>>>>
>>>> 2010/10/11 fp<[E-MAIL ADDRESS DELETED]>:
>>>>> fpです。
>>>>>
>>>>> 「OverRelation」を使わずに以下のようにできることは
>>>>> 認識しています。
>>>>>
>>>>> ; FK_MEMBER_MEMBER_LOGIN_AS_VALID = map:{
>>>>>       ; localTableName  = MEMBER    ; foreignTableName  = MEMBER_LOGIN
>>>>>       ; localColumnName = MEMBER_ID ; foreignColumnName = MEMBER_ID
>>>>>       ; fixedCondition =
>>>>>         exists(select 'TRUE' from MEMBER_STATUS st
>>>>>                 where $$foreignAlias$$.LOGIN_MEMBER_STATUS_CODE =
>>>>>                       st.MEMBER_STATUS_CODE
>>>>>                   and st.DISPLAY_ORDER = 2)
>>>>>       ; fixedSuffix = AsValid
>>>>> }
>>>>>
>>>>>
>>>>> (2010/10/11 16:44), fp wrote:
>>>>>> fpです。
>>>>>>
>>>>>> 久保さん、即座の御返事ありがとうございます。
>>>>>>
>>>>>> ん~、dbflute_exampledb にうまい例が見つからないのですが
>>>>>> 仮に、MEMBER ->      MEMBER_LOGIN ->      MEMBER_STATUS で
>>>>>> MEMBER_STATUS.DISPLAY_ORDER = 2 の条件で
>>>>>> MEMBER ->      MEMBER_LOGIN に業務的one-to-oneなFKを設定できる
>>>>>> とした場合、
>>>>>>
>>>>>> ; FK_MEMBER_MEMBER_LOGIN_AS_VALID = map:{
>>>>>>        ; localTableName  = MEMBER    ; foreignTableName  = MEMBER_LOGIN
>>>>>>        ; localColumnName = MEMBER_ID ; foreignColumnName = MEMBER_ID
>>>>>>        ; fixedCondition =
>>>>>>            $$over(MEMBER_LOGIN.memberStatus)$$.DISPLAY_ORDER = 2
>>>>>>        ; fixedSuffix = AsValid
>>>>>> }
>>>>>> と書きたい、ということです。
>>>>>> 定義上明示されている MEMBER_LOGIN をポイントテーブルと
>>>>>> することに曖昧さがあるとは思わないのですが。
>>>>>>
>>>>>> いままさに定義しようとしているリレーションのための
>>>>>> 条件の指定に、以下は適用できませんし。
>>>>>>> MEMBER.memberStatusByFooCode というように、
>>>>>>> 明示的にリレーションを書いてもらう仕様にしています。
>>>>>>
>>>>>> foreignTable についての認識に齟齬があるのでしょうか?
>>>>>>
>>>>>>
>>>>>> (2010/10/11 15:56), kubo wrote:
>>>>>>> 久保(jflute)です。
>>>>>>>
>>>>>>>> とはいえ、foreignTable をポイントとすることはできないでしょうか?
>>>>>>>
>>>>>>> 例えば、会員に会員ステータスへのFKカラムが二つあった場合、
>>>>>>> ポイントを会員ステータスにするとになります。
>>>>>>> なので、foreignTableに関しては、
>>>>>>> MEMBER.memberStatusByFooCode というように、
>>>>>>> 明示的にリレーションを書いてもらう仕様にしています。
>>>>>>> 親の親の親の親の親のカラムとかになると、指定が長くて
>>>>>>> 大変ですが、曖昧さの可能性も増えるので、
>>>>>>> そこの優先度を練り直したって感じです。
>>>>>>>
>>>>>>>>> ポイントテーブルは ORDER_ITEM で、リレーションは order。
>>>>>>>>>       ->         $$over(ORDER_ITEM.order)$$
>>>>>>>>
>>>>>>>> これは実際の構成ではなく、あくまで例ってことで (^^;
>>>>>>>
>>>>>>> おっと、そうでしたかぁ、失敬w
>>>>> _______________________________________________
>>>>> seasar-dotnet mailing list
>>>>> [E-MAIL ADDRESS DELETED]
>>>>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>>>>
>>>> _______________________________________________
>>>> seasar-dotnet mailing list
>>>> [E-MAIL ADDRESS DELETED]
>>>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>>
>>> _______________________________________________
>>> seasar-dotnet mailing list
>>> [E-MAIL ADDRESS DELETED]
>>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>>
>> _______________________________________________
>> seasar-dotnet mailing list
>> [E-MAIL ADDRESS DELETED]
>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>
> _______________________________________________
> seasar-dotnet mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>


seasar-dotnet メーリングリストの案内