【问题标题】:Using at least in SQL Query至少在 SQL 查询中使用
【发布时间】:2017-12-08 14:21:56
【问题描述】:

我一直在为以下工作进行 SQL 工作。我可以使用“AND”为以下内容编写查询,但我可以在查询中使用“至少”。

找出供应红色部分和绿色部分的供应商。

Select s.sid from suppliers s, catalog c, parts p
where s.sid=c.sid and c.pid=p.pid and p.color='Red'
intersect
Select s.sid from suppliers s, catalog c, parts p
where s.sid=c.sid and c.pid=p.pid and p.color='Green';

如何使用atleast 为类似的问题编写查询

“找出供应至少两个红色部件和至少两个绿色部件的供应商。”

【问题讨论】:

    标签: mysql


    【解决方案1】:

    我个人会避免使用第一个回复中的子选择的查询。这是一个使用带有 GROUP BY 和 HAVING 子句的查询的解决方案。您只需计算红色和绿色,并在 HAVING 中按具有您想要的统计数据的供应商进行过滤。请注意,无需加入供应商表。

    SELECT
      c.sid,
      SUM(CASE WHEN p.color='Red' THEN 1 ELSE 0 END) AS redCt,
      SUM(CASE WHEN p.color='Green' THEN 1 ELSE 0 END) AS greenCt
    FROM
    catalog c
    JOIN parts p ON c.pid = p.pid
    GROUP BY c.sid
    HAVING redCt >= 2 AND greenCt >= 2
    

    http://sqlfiddle.com/#!2/85e8c1/14

    【讨论】:

    • 我避免这样做的原因是它不便携。例如,查询将在 MS SQL 中失败。
    • 没错,尽管他确实将其标记为 MySQL。
    • 同意。只是解释我的答案背后的理由,以防另一个 DBMS 出现类似问题:)
    【解决方案2】:

    试试这个:

    select sid from
    (select 
     s.sid sid, 
     sum(case when p.color = 'Red' then 1 else 0 end) as red, 
     sum(case when p.color = 'Green' then 1 else 0 end) as green
     from suppliers s
     left join catalog c on s.sid = c.sid
     left join parts p on p.pid = c.pid
     group by s.sid) s
    where 
    green >= 2 and red >= 2
    

    这个想法是建立供应商列表,计算他们供应多少红色和绿色部件,然后按阈值过滤。

    SQLFiddle

    【讨论】:

    • 非常感谢您的帮助!!
    【解决方案3】:

    试试这个,

    选择 * 从 ( 从供应商 s 中选择 s.sid ,ROW_NUMBER()OVER(PARTITION BY p.color ORDER BY s.sid DESC )ROWNUM s.sid=c.sid 上的内部连接目录 c INNER JOIN 零件 p ON c.pid=p.pid 其中 p.color='Red' 或 p.color='Green' )T4 WHERE ROWNUM>=2

    【讨论】:

      猜你喜欢
      • 2022-01-16
      • 1970-01-01
      • 2018-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多