【GeneXus】テーブル2個のFor each

For eachでテーブルを2個指定する方法。

環境

GeneXus 16 u2
MySQL

トランザクション

とくにリレーションは作成してません。

For each

Procedure1(SELECT1個になる書き方)

For each t_entry, m_user 
	Where entry_user_id = user_id	// 結合条件
	Where entry_date = &Today		// 通常の検索条件
	
	MSG(user_name)
	
Endfor

Procedure2(SELECT2個になる書き方)

For each
	Where entry_date = &Today		// 通常の検索条件
	
	For each
		Where entry_user_id = user_id	// 結合条件
		MSG(user_name)
	Endfor
	
Endfor

自動生成されたSQL

Procedure1で作成されるSQL

SELECT
  T1.`entry_date`
  , T2.`user_id`
  , T1.`entry_user_id`
  , T2.`user_name`
  , T1.`entry_id` 
FROM
  `t_entry` T1
  , `m_user` T2 
WHERE
  (T1.`entry_user_id` = T2.`user_id`) 
  AND (T1.`entry_date` = ? ) 
ORDER BY
  T1.`entry_id`

Procedure2で作成されるSQL

SELECT
  `entry_user_id`
  , `entry_date`
  , `entry_id` 
FROM
  `t_entry` 
WHERE
  `entry_date` = ? 
ORDER BY
  `entry_id

SELECT
  `user_id`
  , `user_name` 
FROM
  `m_user` 
WHERE
  `user_id` = ? 
ORDER BY
  `user_id

まとめ

SELECTが1個にまとまっていたほうが早い時があるので、使える時には使っていきたいと思います。
まぁリレーション作っていれば
リレーション使って情報取得も可能なんですが、プロジェクトによっては
リレーションがない時もあるので!!!!

注意

環境やバージョンによって出力されるSQLが違うので
必ず出力されるSQLを想定、確認をおこなってください。

以上です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください