来自多个表的SQL行

时间:2018-09-20 21:24:09

标签: sql

我有一个代表列表的表

id  |  item_type  |  item_id
----------------------------
1      'article'     24
2      'post'        9
3      'article'     120
4      'image'       9

item_type基本上表示该行应该来自哪个表,而id是该表的ID。这意味着例如第二行和第四行不相同。

我想说说item_title和更多的列,这些列将根据每个表进行不同的创建。
假设如果item_type ='article',则item_title =该表的标题。
但是,如果item_type是'image',则item_title = author_first_name + author_second_name + image_id
等等...

我正在搜索它或如何处理它。特别是我认为我可以通过带有子查询的sql if语句来解决,但到目前为止还无法取得真正的进展。所以我想寻求帮助或指出正确的方向。

2 个答案:

答案 0 :(得分:3)

尽管接受的答案是准确且相对简洁的,但也很费力。 article表已联接到postimage行,即使结果被丢弃。)

为了改进,您可以从...开始...

select
    i.*,
    case 
      when i.item_type = 'article' then a.title
      when i.item_type = 'post'    then p.post_title
      when i.item_type = 'image'   then g.author_first_name + g.author_second_name + g.image_id
    end as item_title
  from item i
  left join article a on i.item_id = a.id AND i.item_type = 'article'
  left join post    p on i.item_id = p.id AND i.item_type = 'post'
  left join image   g on i.item_id = g.id AND i.item_type = 'image'

尽管很多优化师实际上并不喜欢那样。如果您真的想充分利用数据库,我会在item(item_type)上放置一个索引,然后为每种类型使用显式逻辑...

   SELECT i.*, a.title
     FROM item i
LEFT JOIN article a ON i.item_id = a.id
    WHERE i.item_type = 'acticle'

UNION ALL

   SELECT i.*, p.post_title
     FROM item i
LEFT JOIN post p ON i.item_id = p.id
    WHERE i.item_type = 'post'

UNION ALL

   SELECT i.*, g.author_first_name + g.author_second_name + g.image_id
     FROM item i
LEFT JOIN image g ON i.item_id = g.id
    WHERE i.item_type = 'image'

long绕的时间更长,但更加明确和友好。

答案 1 :(得分:0)

您可以对所有这些表执行userDetailsService(CustomUserDetailsService) { it.autowire = true apiService = ref('apiService') } ,并使用适当的列组成标题,如:

OUTER JOIN