【问题标题】:Join table based on column value in SQL Server基于 SQL Server 中的列值连接表
【发布时间】:2017-07-31 12:32:39
【问题描述】:

项目表格

id  key code    description
------------------------------
1   1   misc    miscellaneous
2   1   med     medicine    

杂项表:

id  code    description
------------------------
1   misc1   miscellaneous
2   misc1   miscellaneous

医药表:

id  code        description
---------------------------
1   medicine1   medicine
2   medicine1   medicine

我有这个表结构;我的主表是Item 表,我想根据主表中的列值将主表与其他表连接起来。确定要连接的表的列是code。如果代码是misc,则加入misc table,如果值是med,则加入medicine table

我知道table like的基本JOIN

SELECT * 
FROM item 
INNER JOIN miscellaneous ON item.key = miscellaneous.id

但是当有条件会指向哪个表指向JOIN时不知道怎么加入

【问题讨论】:

  • 那是真正的有线!!!你真正想要达到的目标是什么?
  • 能够根据主表中一列的值加入表。我有一个代码列,如果代码是 misc JOIN with miscellaneous table 但如果代码是 med JOIN 与医学表 @Rahul
  • 这里有条件连接的一些选项Conditional Joins
  • @SQLAndOtherStuffGuy 会调查并尽快返回这里

标签: sql sql-server join


【解决方案1】:

您可以使用left join。像这样的:

select i.*,
       coalesce(mi.code, me.code) as code_1,
       coalesce(mi.description, me.description) as description_1
from item i left join
     miscellaneous mi
     on mi.code = i.key and i.code = 'misc' left join
     medicine me
     on me.code = i.key and i.code = 'med';

【讨论】:

  • 我不认为这是适用的,我会尝试一下并尽快回到这里。
  • 条件选择可行吗?
【解决方案2】:

您可以尝试LEFT JOIN,这将是实现此功能的最简单方法。 但是,如果您希望两个表结果都在一个列名下,请使用UNION ALL

使用UNION ALL

SELECT *
FROM item i
INNER JOIN miscellaneous m on m.code=i.code
UNION ALL
SELECT *
FROM item i
INNER JOIN medicine  me on me.code=i.code

使用LEFT JOIN

SELECT *
FROM item i
LEFT JOIN miscellaneous m on m.code=i.code
LEFT JOIN medicine  me on me.code=i.code

【讨论】:

    【解决方案3】:

    由于 Item 是您的“基础”/主表,您可以使用 LEFT JOIN 匹配其他表,以便 Item 表中的所有行都存在。

    SELECT * 
    FROM Item AS i
    LEFT JOIN Miscellaneous AS mi ON (mi.[id] = i.[key] AND i.code = 'misc')
    LEFT JOIN Medicine AS me ON (me.[id] = i.[key] AND i.code = 'med');
    

    您还可以使用 ISNULL() 函数与一些前置条件组合 Miscellaneous & Medicine 表列

    SELECT i.*
      , ISNULL(mi.id, me.id) AS m_id
      , ISNULL(mi.code, me.code) AS m_code
      , ISNULL(mi.description, me.description) AS m_description
    FROM Item AS i
    LEFT JOIN Miscellaneous AS mi ON (mi.id = i.[key] AND i.code = 'misc')
    LEFT JOIN Medicine AS me ON (me.id = i.[key] AND i.code = 'med');
    

    SqlFiddle Demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-15
      • 1970-01-01
      • 2015-02-03
      • 1970-01-01
      • 2015-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多