【问题标题】:TSQL How to select value based on another valueTSQL如何根据另一个值选择值
【发布时间】:2018-09-19 03:16:34
【问题描述】:

所以我试图根据另一列的值选择一个值。例如,在下表的行中,我想选择 ID 列,其中没有一个特定值具有 Status 列的“Transferred”值。因此,对于下面的行,查询只会返回值“DEF”。我不知道该怎么做。

ID                    Status  
====                  ===========
ABCD                  Received    
ABCD                  Transferred    
XYZ                   Received
XYZ                   Transferred
DEF                   Received

【问题讨论】:

  • 我投票决定将此问题作为离题结束,因为这不是“针对专业和发烧友程序员”的问题,此人是初学者,需要初学者教程。
  • Ben - 首先,这个问题不是题外话。它与 SQL 和 TSQL 直接相关。不知道为什么你会建议它是题外话。其次,你表现得好像这是一个微不足道的问题,但事实并非如此。我正在做一个更大级别的查询,我大大简化了它,以便于理解其他人并帮助找到解决方案。
  • 是的,我真的不会认为这是一个微不足道的问题(我也不同意 Ben 的观点,即“专业和爱好者”不包括初学者;在我看来,爱好者 = 初学者)。但是,我相信 Ben 只是误读/误解了您的问题,因为不可否认,我什至花了几次通读才明白您不仅仅是在寻找 SELECT * FROM table WHERE [Status] 'Transferred'
  • 第一篇一页教程解答了。 SO 上必须至少有一千个等效问题,因此无法找到重复的问题。但不:问,回答,10 分!这个问题是目前 Stack Overflow 的所有问题。

标签: sql tsql ssms ssms-2012


【解决方案1】:

您可以尝试使用NOT IN

   SELECT ID
    FROM YourTable 
    WHERE ID NOT IN (SELECT ID FROM YourTable WHERE Status = 'Transferred')

另一个使用NOT EXISTS的选项

SELECT DISTINCT id 
FROM yourtable yt1
WHERE NOT EXISTS (SELECT * FROM yourtable yt2 WHERE yt1.id = yt2.id AND Status='Transferred') 

【讨论】:

    【解决方案2】:

    试一试..

    SELECT DISTINCT id 
    FROM your_table_name
    WHERE NOT EXISTS (SELECT id FROM your_table_name WHERE Status='Transferred') 

    【讨论】:

    • 由于子查询与外部查询不相关,这可能无法按您的预期工作。有关相关版本,请参阅 SQLChao 的答案。
    • 哈。你可能是对的。我有 WHERE id NOT IN(但由于某种原因将其编辑为 WHERE NOT 存在。
    【解决方案3】:

    另一种可能的解决方案:

    declare @t table (ID varchar(4), Status varchar(11))
    insert @t (ID, Status) VALUES 
    ('ABCD','Received'),
    ('ABCD','Transferred'),
    ('XYZ','Received'),
    ('XYZ','Transferred'),
    ('DEF','Received')    
    
    select [ID], p.Received, isnull(p.Transferred,0) Transferred
    FROM (select id, Status, count(1) cnt from @t group by id, status) t
    PIVOT
    (
         sum(cnt) for status in (Received,Transferred) 
    ) AS p
    where Transferred is null or Transferred = 0
    

    这样做的好处是使您的 where 子句中的所有状态都可用。我怀疑它是迄今为止 3 个答案中效率最低的,但它可能很有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-09
      • 2012-05-29
      • 1970-01-01
      • 1970-01-01
      • 2013-05-03
      • 2020-04-06
      相关资源
      最近更新 更多