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

确定在SQL Server的select查询中返回特定行的where子句

  •  1
  • Jerokdeep  · 技术社区  · 8 年前

    我使用SQL Server中的select查询连接三个表以获得结果。

    1. 股票行情表
    2. 扇区表

    虽然联系人表包含单个联系人记录,但其他两个表中的每个联系人都有多个记录。基本上,它包含了此人拥有的股份(如苹果、微软等)和他感兴趣的领域。当我们发送搜索条件(如“Apple”、“Health Sector”等)时,select查询为每个联系人返回一行。现在,在返回的结果中,我想打印一列,其中包含有关匹配条件的信息。

    例如

    ----------------------------------------------------
    Contact id  name    email
    ----------------------------------------------------
        1       John    john@sas.com
        2       Bret    bret@sas.com
        3       Mike    mike@cityon.com
    
    Ticker  id  contact_id  Ticker
    ---------------------------------------------------
        1   1   APPLE
        2   1   MCSFT
        3   2   GOOGLE
        4   3   APPLE
    
    Sector  id  contact_id  Sector
    ---------------------------------------------------
        1   1   Health
        2   2   Retail
        3   2   FMCG
        4   3   FMCG
    

    查询是:

    select 
        id, name, email, reason
    from 
        contact
    where 
        id in (select ttemp.contact_id
               from ticker ttemp
               where ttemp.ticker in ('GOOGLE')) 
        or id in (select stemp.contact_id 
                  from sector stemp
                  where stemp.sector in ('FMCG'))
    

    现在它返回触点2(Bret)和3(Mike)。我想打印'谷歌,快速消费品'的布雷特和'快速消费品'的迈克在 原因

    希望我清楚这一点。朋友们,有什么建议吗?

    2 回复  |  直到 8 年前
        1
  •  0
  •   Gordon Linoff    8 年前

    我想我应该使用一个子查询:

    select id, name, email, reason,
           stuff( coalesce(',' + ticker, '') + coalesce(',' + sector),
                  1, 1, ''
                )
    from (select c.*,
                 (case when id in (select ttemp.contact_id
                                   from ticker ttemp
                                   where ttemp.ticker in ('GOOGLE')
                                  )
                       then 'GOOGLE'
                  end) as ticker,
                 (case when id in (select stemp.contact_id 
                                   from sector stemp
                                   where stemp.sector in ('FMCG')
                                  )
                       then 'FMCG'
                  end) as sector
          from contact c
         ) c
    where ticker is not null or sector is not null;
    
        2
  •  0
  •   Zorkolot    8 年前

    这里有一种使用左连接的方法。如果联系人的左连接既无“谷歌”也无“快速消费品”,则两个字段均应为空。在WHERE中,我将任何NULL与空格合并,以查看连接是否会导致空字符串。

    SELECT C.Contact_id
          ,C.name
          ,C.email
          ,REPLACE(LTRIM(COALESCE(T.Ticker, '') + ' ' 
                       + COALESCE(S.Sector, '')
                  ), ' ', ', ') AS Reason
      FROM contact C LEFT JOIN ticker T ON C.Contact_id = T.contact_id AND Ticker = 'GOOGLE'
                     LEFT JOIN sector S ON C.Contact_id = S.contact_id AND S.Sector = 'FMCG'
    WHERE COALESCE(T.Ticker, '') + COALESCE(S.Sector, '') <> ''
    

    产生输出:

    Contact_id  name    email            Reason
    2           Bret    bret@sas.com     GOOGLE, FMCG
    3           Mike    mike@cityon.com  FMCG
    

    http://sqlfiddle.com/#!6/40090/19/0