基于SQL Server中的列值连接表

4

项目

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

我将为您翻译关于IT技术的内容。下面是需要翻译的内容:

我有这个表结构;我的主表是Item表,我想根据主表中的列值将主表与其他表进行JOIN操作。决定要加入的表的列是code。如果code是misc,则连接到misc table,如果值是med,则连接到medicine table

我知道类似于基本的JOIN表格的操作如下:

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

但是当有一个条件指向哪个表进行连接时,我不知道该如何加入JOIN


这真的很奇怪!!!你实际上想要实现什么? - Rahul
能够根据主表中一个列的值来JOIN表。我有一个code列,它会告诉我要JOIN哪个表,就像我的例子中,如果code是misc,则JOIN杂项表,但如果code是med,则JOIN药品表。@Rahul - Martin
这里有一些条件连接的选项 条件连接 - SQLAndOtherStuffGuy
@SQLAndOtherStuffGuy会调查一下,并尽快回复到这里。 - Martin
4个回答

6
你可以使用 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';

我原本认为这不适用,但我会尝试一下并尽快回来。 - Martin
条件选择是可行的吗? - Martin

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

0

由于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演示


0

你可以以动态方式完成这项任务

  1. 测试数据集的准备

    IF (OBJECT_ID('item') IS NULL)
    BEGIN 
     CREATE TABLE item (id int, [key] nvarchar(128), code nvarchar(128), 
     description nvarchar(512))
     INSERT INTO item (id, [key] , code, description)
      SELECT 1, 1, 'misc', 'miscellaneous'  UNION ALL
      SELECT 2, 1, 'med', 'medicine'UNION ALL
      SELECT 3, 2, 'test not existing table', 'not_existing_table';
    END
    
    IF (OBJECT_ID('miscellaneous') IS NULL)
    BEGIN 
     CREATE TABLEe miscellaneous (id int, code nvarchar(128), description 
     nvarchar(512))
     INSERT INTO miscellaneous (id, code, description)
      SELECT 1, 'misc1', 'miscellaneous'  UNION ALL
      SELECT 2, 'misc2', 'miscellaneous_xxx';
    END
    
    IF (OBJECT_ID('medicine') IS NULL)
    BEGIN 
     CREATE TABLE medicine (id int, code nvarchar(128), description 
     nvarchar(512))
     INSERT INTO medicine (id, code, description)
      SELECT 1, 'medicine1', 'medicine'  UNION ALL
      SELECT 2, 'medicine2', 'medicine_xxx';
    END
    
  2. SQL脚本

    DECLARE @joins nvarchar(max) ='',@sql NVARCHAR(MAX) = ' SELECT * FROM item';
    
    
    SELECT @joins =     STUFF((SELECT ( CHAR(13)+CHAR(10) + '  LEFT JOIN ' + 
    description + ' ' + description + ' ON ' + description +'.id = item.[key] AND  item.description = ''' + description + '''' )
        FROM item i WHERE ISNULL(description,'') != '' AND
        (select  OBJECT_ID(description) ) IS NOT NULL
        GROUP BY description
        ORDER BY description
        FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'');
    
    
        IF(ISNULL(@joins,'') != '' )
        BEGIN
         SET @sql = @sql + @joins;
         EXECUTE sp_executesql @sql;
         PRINT @sql
        END;
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接