【问题标题】:SQL select group and filterSQL 选择组和过滤器
【发布时间】:2016-06-02 13:15:11
【问题描述】:

以下数据在数据库表中

Color   MADE    MODEL   REG
-----   ----    -----   ----
Red     TOYOTA  CAR     EN-9082   *
Yellow  TOYOTA  CAR     YR-4356   *
Red     TOYOTA  JEP     AX-4566
Yellow  TOYOTA  SUV     AX-4343
Yellow  NISSAN  CAR     ER-0873
Yellow  HONDA   SUV     AS-6453   *    ^
Red     HONDA   SUV     SD-9853   *    ^
Blue    HONDA   SUV     AS-9762        ^

当颜色“红色”和“黄色”传入时,我必须编写一个代码来提取由“*”指示的记录(没有聚合只是过滤它们)。

同样,如果我传递颜色“红色”、“黄色”和“蓝色”,我需要“^”指示的记录

换句话说,我需要所有传入颜色都可用于制造和型号组合的记录。

另一方面,我不能在 SQL 中使用颜色名称。它们被传递到我的程序中,我无法控制它们。

是否可以编写一个理想地使用纯 SQL 的 SQL。我需要针对多个数据库(例如 Oracle、SQL 服务、Informix)执行它

伊什

【问题讨论】:

  • 您不能只使用 SQL,对所有 DBMS 都可用,然后说您不想要硬编码值。那三个不结婚。必须有某种方法来传递这些值,它可以在代码中(在 vkp 提供的 SQL 中注入参数)或某种存储过程 (MSSQL)。

标签: sql


【解决方案1】:

你可以试试这个。 having 可以扩展为其他颜色组合。

select *
from tablename 
where made in (select made
               from tablename
               group by made
               having count(case when color in ('Red','Yellow') then 1 end) >= 2)

【讨论】:

  • @vpk 感谢您的回答。但我不能对颜色进行硬编码。这些将在参数中传递。我应该在问题中提到。我会更新的
  • 我不明白为什么您不能在此查询中使用参数。您可以传入参数而不是硬编码值
  • @vpk,我弄错了。是的,我可以将参数放入查询中。我会再检查一次。谢谢
【解决方案2】:

vkp 的回答基本正确。我认为它更简单地写成:

select t.*
from tablename  t.
where made in (select t2.made
               from tablename t2
               where t2.color in ('Red', 'Yellow')
               group by t2.made
               having count(*) = 2
              );

如果允许重复,则having 子句应为count(distinct color) = 2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多