【问题标题】:SQL filter by Subquery按子查询进行 SQL 过滤
【发布时间】:2020-03-08 17:51:15
【问题描述】:

我有下表:

ID      WBSTK   
77807   C  
77808   C  
80345   A  
80383   A  
80989   A  
85997   C  
91212   A  
91397   A  

我想要的结果是:

ID      WBSTK   
80345   A  
80383   A  
80989   A  

因此,我希望得到所有 ID 小于任何“C”的“A”。
我尝试了类似的方法,但无法正常工作:

    SELECT   vbuk1.ID,  vbuk1.WBSTK,  vbuk2.ID
    FROM t1 vbuk1 
         LEFT JOIN (SELECT ID,  WBSTK 
         FROM t1 WHERE WBSTK='C'  ) vbuk2 ON vbuk1.ID=vbuk2.ID
    WHERE vbuk1.ID<=vbuk2.ID

有人有想法吗?

【问题讨论】:

  • 以下答案是根据您的原始问题和人们投入时间来回答的。
  • 对不起。如您所见,我是 StackOverflow 的新手,所以我不太了解此站点上的程序和注意事项。我现在明白了。感谢您的回答!欣赏!

标签: sql filter subquery


【解决方案1】:

您可以使用子查询进行过滤

您可以使用相关子查询进行过滤

select t.*
from mytable t
where 
    wbstk = 'A'
    and id < (select max(id) from mytable where wbstk = 'C')

或者您可以根据您的加入策略:

select t.*
from mytable t
inner join (select max(id) id from mytable where wbstk = 'C') d
    on t.id < d.id
where wbstk = 'A'

Demo on DB Fiddle

编号 | wbstk ----: | :---- 80345 |一种 80383 |一种 80989 |一种

【讨论】:

  • 谢谢。由于我在 EDIT 中描述的增强功能,我认为无法使用 MAX 语句。
  • @大卫。 . .您已经接受了这个答案,大概是因为它回答了您最初的问题。我建议您撤消对问题的编辑,重新接受此答案,然后提出新问题。
  • 嗨,戈登,我是 S.O. 的新手。所以我不太了解这个网站上的程序和注意事项。我现在理解得更好了。感谢您的提示,我会遵循的!
【解决方案2】:

这是您的查询。

select  t1.ID, t1.WBSTK
from vbuk1 t1
inner join vbuk1 t2 on t2.ID > t1.ID and t2.WBSTK='C' 
where t1.WBSTK='A' 

dbfiddle

【讨论】:

    【解决方案3】:

    在大多数数据库中,您可以这样做:

    select t.* 
    from t
    where t.id < all (select t2.id from t t2 where t2.WBSTK = 'C') and
          t.WBSTK = 'A';
    

    这很方便,因为即使没有 Cs,它也会返回所有 As。

    编辑:

    如果你真的不想看到任何好像没有Cs,那么只需在子查询中使用聚合:

    select t.* 
    from t
    where t.id < (select max(t2.id) from t t2 where t2.WBSTK = 'C') and
          t.WBSTK = 'A';
    

    【讨论】:

    • 感谢您的意见。但这是我想要避免的。正如所写,我只想查看 ID 小于任何 C 的 As
    • @大卫。 . .你想避免什么?这似乎回答了你的问题。
    • 如果没有比A大的C,我不想看到任何A。
    • @大卫。 . .查询很容易调整。
    • 谢谢@Gordon!你看到我的编辑了吗?你知道是否可以在组级别上与 MAX ID 进行比较?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    • 2019-03-01
    相关资源
    最近更新 更多