Tips

フォーミュラによるクエリでSQL JOINを使用する

日付2009/01/01
ID09-017
バージョン11
プラットフォームWin & Mac

[Table_A]field_X = [Table_B]field_Yのような式でクエリを実行する場合、Table_AとTable_Bの間に自動リレーションがストラクチャレベルで定義されていることは必須ではありません。4D v11 SQL Release 2 (11.2)の追加/修正情報に記載されているとおり、そして4D v11 SQL Release 3 (11.3)のランゲージリファレンスで説明されているとおり、フォーミュラによるクエリはSQLモデルに基づくジョインを実行することができます。このモデルにより、互いに自動リレートで接続されていないテーブル同士であっても、一方に対して実行されたクエリの結果に基づいて他方のセレクションを作成することができます。(以前のバージョンでは自動リレートが必須でした。)

http://www.4d.com/docs/CMJ/CMJ00048.HTM

v11.2以降で新しく作成されたデータベースは、デフォルトでこの設定が有効になっています。しかし、変換されたデータベースの場合、互換性を維持する観点からこの設定は環境設定で明示的に有効にされるまで無効になっています。

関連して新しいセレクタがSET DATABASE PARAMETER、GET DATABASE PARAMETERで利用できるようになりました。49番"QUERY BY FORMULA Joins"の場合、0はデータベースの環境設定を使用、1は常に自動リレーションを要求する、2は可能であればSQL JOINを使用する、となっています。

http://www.4d.com/docs/CMJ/CMJ00642.HTM

$currentVal:= Get database parameter(QUERY BY FORMULA Joins) 
SET DATABASE PARAMETER(QUERY BY FORMULA Joins;2)  `Activate SQL joins
 `Query all the lines of "ACME" client invoices even though the tables are not related
QUERY BY FORMULA([invoice_line] ; [invoice_line]invoice_id = [invoice]id & [invoice]client = "ACME")
SET DATABASE PARAMETER(QUERY BY FORMULA Joins;$currentVal) `We re-establish the current settings