2

これが私のクエリのサンプルです:

SELECT ...
TRIM(eml.fxeml1) as "Email Address"
FROM pfship

LEFT JOIN mstfxem fax
ON fax.fxco=pfship.cshco AND fax.fxdiv=pfship.cshdiv AND fax.fxsold=pfship.cshsld
AND fax.fxtype='C' AND TRIM(fax.fxfax1) <> '' AND fax.fxdept LIKE '*F%'

LEFT JOIN mstfxem eml
ON eml.fxco=pfship.cshco AND eml.fxdiv=pfship.cshdiv AND eml.fxsold=pfship.cshsld
AND eml.fxtype='C' AND TRIM(eml.fxeml1) <> '' AND eml.fxdept LIKE '*E%'

WHERE ((pfship.cshco || '/' || pfship.cshdiv) = ?)
  AND (? = '*ALL' OR CAST(cshsld AS CHAR(15)) = ?) 
  AND ...
  ORDER BY TRIM(cshnme)

このクエリは9レコードを返す必要があります。削除すると:

LEFT JOIN mstfxem fax
ON fax.fxco=pfship.cshco AND fax.fxdiv=pfship.cshdiv AND fax.fxsold=pfship.cshsld
AND fax.fxtype='C' AND TRIM(fax.fxfax1) <> '' AND fax.fxdept LIKE '*F%'

LEFT JOIN mstfxem eml
ON eml.fxco=pfship.cshco AND eml.fxdiv=pfship.cshdiv AND eml.fxsold=pfship.cshsld
AND eml.fxtype='C' AND TRIM(eml.fxeml1) <> '' AND eml.fxdept LIKE '*E%'

9レコードを取得しますが、それを使用すると360レコードを取得します。私の参加の何が問題になっていますか?

ありがとう

問題は、1人が多くの電子メールやFAXを受信できることだと思いますが、結果をレコードごとに1つの文字列にグループ化して、最終的に9つのレコードだけにする方法を教えてください。

4

1 に答える 1

0

結合に問題はありません。テーブル間に 1 対多の関係があります。

必要なものに応じて、いくつかのテクニックがあります。まずは導出表です。1 対多のテーブルから 1 つのレコードのみを選択するクエリを作成します (要件では、選択するレコードを指定する必要があります)。代わりにそれに参加してください。または、左側の結合にさらに条件を付けて、1 つのレコードのみを取得することもできます。これらの手法の例:

select t1.field1, t2.email
from table1 t1 
join (select myid, max(email) as email from table2 group by myid) t2 
  on t1.myid = t2.myid

または

select t1.field1, t2.email
from table1 t1 
Left join from table2  t2 
  on t1.myid = t2.myid and t2.active = 1

または、すべての電子メールをカンマ区切りのリストで表示する場合、そのコードはデータベース固有のものであり、使用しているデータベース バックエンドをお知らせください。

于 2012-08-09T15:17:04.717 に答える