代码之家  ›  专栏  ›  技术社区  ›  lumberjack4

对单个表具有多个引用的SQL选择

  •  13
  • lumberjack4  · 技术社区  · 14 年前

    我有一个包含多个关系表的SQL数据库。主表中的某些字段多次引用另一个表。例如,假设我有一个销售人员数据库,他们负责多个州的销售。我的数据库有State1、State2和State3字段,所有这些字段都映射回States表。我一辈子都不知道如何编写一个查询来返回一个包含所有枚举状态的记录。如果我只需要一个状态字段,我知道我会这样做:

    SELECT Master.Name, State.Enumeration AS 'State'
    FROM MasterTable Master, StateTable State
    WHERE Master.State1 = State.ID;
    

    如何将其扩展到所有状态字段?

    谢谢。

    2 回复  |  直到 14 年前
        1
  •  11
  •   Fosco    14 年前

    从每个唯一联接返回一列到状态:

    select m.Name, s1.Enumeration as State1, s2.Enumeration as State2, s3.Enumeration as State3
    from MasterTable m
    left join StateTable s1 on m.State1 = s1.ID
    left join StateTable s2 on m.State2 = s2.ID
    left join StateTable s3 on m.State3 = s3.ID
    

    返回3个联接中所有状态的1列:

    select m.Name, ISNULL(s1.Enumeration + ',','') 
                   + ISNULL(s2.Enumeration + ',','') 
                   + ISNULL(s3.Enumeration,'') as Enumeration
    from MasterTable m
    left join StateTable s1 on m.State1 = s1.ID
    left join StateTable s2 on m.State2 = s2.ID
    left join StateTable s3 on m.State3 = s3.ID
    

    还有列查询…

    select m.Name,
     ISNULL((select Enumeration from StateTable where ID = m.State1),'') as State1,
     ISNULL((select Enumeration from StateTable where ID = m.State2),'') as State2,
     ISNULL((select Enumeration from StateTable where ID = m.State3),'') as State3
    from MasterTable m
    
        2
  •  6
  •   OMG Ponies    14 年前

    您需要使用表别名来联接同一表的多个副本:

       SELECT m.Name, 
              s1.Enumeration AS 'State1',
              s2.Enumeration AS 'State2'
         FROM MasterTable m
    LEFT JOIN StateTable s1 = s1.id = m.state1
    LEFT JOIN StateTable s2 = s1.id = m.state2
    

    内部联接要求数据存在-如果不存在,则排除整个记录。左联接更安全,例如,如果state1/2/3/etc允许空值…