2012-06-01 2 views
0

У меня есть таблица заметок, в которой хранятся заметки о таблицах клиентов, рабочих мест и продуктов.
Таблицы клиентов, рабочих мест и продуктов имеют столбцы «Имя» и «Идентификатор» (GUID).
Я хочу получить заметку и связанное с ней имя объекта в одном запросе. (Если мое примечание связано с клиентом, связанное с ним имя объекта будет customername и т. Д.)Как получить один из нескольких связанных столбцов

Возможно ли это сделать с помощью одного запроса? Если да, то как?

+0

Это должно быть возможно, если вы разделяете последовательность между клиентами/рабочими местами/продуктами. Это также может быть возможно, если вы разделите фактическую схему с нами. Как бы вы решили получить его из второго запроса? –

+0

мои таблицы выглядят так: http://tinypic.com/r/116nei8/6 – aliassce

+0

Я не понимаю, как вы можете реально узнать, на какой объект вы указываете. Связанный столбец obj - это действительно объединение - он может указывать на работу, клиента или продукт. Каждый раз, когда один и тот же идентификатор делится на два объекта, становится невозможно узнать, какой результат получается. Я что-то упускаю? –

ответ

1
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"]) 

Дополнительные столбцы и отображения логики могут или не могут быть необходимы, в зависимости от как вы привязаны к мысли о том, что он говорит «Имя клиента». Я бы, наверное, сохранил его лично. Я думаю, вы могли бы, вероятно, перетасовать много этой логики в свое реляционное сопоставление объектов, если оно у вас есть. Это может быть или не быть такой горячей идеей, в зависимости от того, сколько строк у вас в таблице заметок.

+0

Цистерны. Я думаю, что это работает для моей ситуации. На самом деле в моей таблице заметок есть столбец, показывающий, относится ли моя записка к заданию, продукту или клиенту. Но в этой ситуации я хотел показать только имя связанного объекта рядом с моей записью. Когда это необходимо, я получу детали связанного объекта отдельно. – aliassce

+0

А, да. Тогда вы полностью смотрите на coalesce или подобное. Удачи и извините за задержку в возвращении к вам. –

Смежные вопросы