顧客、仕事、製品のテーブルに関するメモを格納するメモテーブルがあります。
顧客、ジョブ、および製品のテーブルには、「名前」列と「ID」(GUID)列があります。
1つのクエリでメモとそれに関連するオブジェクト名を取得したいと思います。(私のメモが顧客に関連している場合、関連するオブジェクト名はcustomername
、などになります。)
単一のクエリでこれを行うことは可能ですか?もしそうなら、どのように?
顧客、仕事、製品のテーブルに関するメモを格納するメモテーブルがあります。
顧客、ジョブ、および製品のテーブルには、「名前」列と「ID」(GUID)列があります。
1つのクエリでメモとそれに関連するオブジェクト名を取得したいと思います。(私のメモが顧客に関連している場合、関連するオブジェクト名はcustomername
、などになります。)
単一のクエリでこれを行うことは可能ですか?もしそうなら、どのように?
select
notes.id,
notes.content as content,
coalesce(customers.name, jobs.name, products.name) as name,
customers.id as customer_id,
jobs.id as job_id,
products.id as product_id
from notes
left outer join customers on notes.relatedobjid = customers.id
left outer join jobs on notes.relatedobjid = jobs.id
left outer join products on notes.relatedobjid = products.id
;
これをDAO/表示コードのロジックでラップします(かなり読みやすいのでPython):
for row in query.list():
if row["customer_id"] is not None:
display_type = "customer name"
elif row["job_id"] is not None:
display_type = "job name"
elif row["product_id"] is not None:
display_type = "product name"
display_note(display_type, row["name"], row["content"])
追加の列と表示ロジックは、「顧客名」と表示するというアイデアにどれだけ執着しているかに応じて、必要な場合と不要な場合があります。個人的には保管しておきます。オブジェクトリレーショナルマッピングがある場合は、おそらくこのロジックの多くをシャッフルしてオブジェクトリレーショナルマッピングに組み込むことができると思います。これは、メモテーブルの行数に応じて、それほどホットなアイデアである場合とそうでない場合があります。