SQLでテーブルを結合するときにループを作成しないように教えられたことを覚えています。実際、ビジネス オブジェクトを使用すると、ユニバースで定義したスキーマにループがあるかどうかもわかります。
この声明についてウェブで検索しようとしましたが、参考文献を見つけることができませんでした。
なぜこれを行うのは危険なのですか?
編集:多分私は簡潔すぎました。
私の質問は、「FOR LOOP」などを意図したループに関するものではありませんでした。SELECT ステートメントの WHERE 句のようなものについて話していました。
WHERE TABLE1.foo = TABLE2.foo
AND TABLE2.bar = TABLE3.bar
AND TABLE3.baz = TABLE1.baz
リレーションを描画すると、結合に「ループ」が表示されます。これは、正確性および/またはパフォーマンスの観点から危険ですか?
ありがとうございます。
編集 2: 例を追加しました。
例を考えただけです。おそらくそれは最善ではないかもしれませんが、理解するのに役立つと思います。
------------ ----------------- ----------------------
- DELIVERY - - DELIVERY_DATE - - DELIVERY_DETAILS -
------------ ----------------- ----------------------
- id - <--- - id - <----- date_id -
- company - |----- delivery_id - - product -
- year - - date - - quantity -
- number - ----------------- - datetime_of_event -
- customer - ----------------------
- ----------
1 <-----> N 1 <----> N
- DELIVERY テーブルでは、すべての配送が 1 回だけ表示されます
- DELIVERY_TABLE には、配送が処理されたすべての日付のリストがあります。そのため、お届けまでに数日かかる場合がございます。
- 最後の表には、すべての配送の詳細があります。したがって、このテーブルでは、配送の準備に関連するすべてのイベントを追跡します
したがって、カーディナリティは、テーブルの各カップルに対して 1:N です。
結合は非常に簡単です:
DELIVERY.id = DELIVERY_DATE.delivery_id AND
DELIVERY_DATE.id = DELIVERY_DETAILS.date_id
ここで、特定の日付の配達に関するその他の情報が含まれている別のテーブルに参加したいとします。それを定義しましょう:
------------
- EMPLOYEE -
------------
- company -
- year -
- number -
- date -
- employee -
------------
結合は次のようになります。
DELIVERY.id = DELIVERY_DATE.delivery_id AND
EMPLOYEE.company = DELIVERY.company AND
EMPLOYEE.year = DELIVERY.year AND
EMPLOYEE.number = DELIVERY.number AND
EMPLOYEE.date = DELIVERY_DATE.date
要約すると、DELIVERY と DELIVERY_DATE の両方に EMPLOYEE を参加させ、参加にサイクルを持たせます。
このように書き直すべきでしょうか?
EMPLOYEE.company = DELIVERY.company AND
EMPLOYEE.year = DELIVERY.year AND
EMPLOYEE.number = DELIVERY.number AND
EMPLOYEE.date IN (SELECT date FROM DELIVERY_DATE d WHERE d.delivery_id = DELIVERY.id)
編集 3: ついにリンクが見つかりました
いつものように、リンクを探すのをあきらめると、リンクが見つかります。
したがって、この記事ではすべてを説明します。Business Objects に関連していますが、内容は一般的です。
お時間をいただきありがとうございます。