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
;
Wrap это с какой-то логики в DAO/код отображения (питон, потому что это довольно легко читать):
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"])
Дополнительные столбцы и отображения логики могут или не могут быть необходимы, в зависимости от как вы привязаны к мысли о том, что он говорит «Имя клиента». Я бы, наверное, сохранил его лично. Я думаю, вы могли бы, вероятно, перетасовать много этой логики в свое реляционное сопоставление объектов, если оно у вас есть. Это может быть или не быть такой горячей идеей, в зависимости от того, сколько строк у вас в таблице заметок.
Это должно быть возможно, если вы разделяете последовательность между клиентами/рабочими местами/продуктами. Это также может быть возможно, если вы разделите фактическую схему с нами. Как бы вы решили получить его из второго запроса? –
мои таблицы выглядят так: http://tinypic.com/r/116nei8/6 – aliassce
Я не понимаю, как вы можете реально узнать, на какой объект вы указываете. Связанный столбец obj - это действительно объединение - он может указывать на работу, клиента или продукт. Каждый раз, когда один и тот же идентификатор делится на два объекта, становится невозможно узнать, какой результат получается. Я что-то упускаю? –