【问题标题】:Identify the where clause which returns a specific row in select query in SQL Server识别在 SQL Server 的选择查询中返回特定行的 where 子句
【发布时间】:2018-05-09 22:37:32
【问题描述】:

我正在使用 SQL Server 中的选择查询连接三个表以获取结果。

  1. 联系表
  2. 代码表
  3. 扇区表

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

例如

----------------------------------------------------
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)。我想在 reason 列中为 Bret 打印“GOOGLE, FMCG”,为 Mike 打印“FMCG”。

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

【问题讨论】:

  • 编辑您的问题并显示您想要获得的结果。

标签: sql sql-server select subquery


【解决方案1】:

我想我会使用子查询:

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;

【讨论】:

  • 感谢 Gordon,它有效,很抱歉延迟接受。项目前线压力太大。 :-(
【解决方案2】:

这是使用 LEFT JOIN 的一种方法。如果联系人通过左连接既没有“GOOGLE”也没有“FMCG”,那么这两个字段都应该为 NULL。在 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-27
    • 2021-07-23
    • 1970-01-01
    • 1970-01-01
    • 2014-11-04
    • 2021-10-14
    • 1970-01-01
    相关资源
    最近更新 更多