当前位置: 首页 > 面试题库 >

SQL仅在所有行均符合条件时选择行

桓高澹
2023-03-14
问题内容

我对SQL还是很陌生,尽管我可以编写大多数查询,但是我对它却一无所知。我想通过一个可以使用JPA执行的查询来实现这一点。

TABLE RULE:
RULE_ID   ENABLED
-----------------
1         0
2         0
3         0
4         1
5         1

TABLE MISC:
MISC_ID
--------
1
2

TABLE HOLD:
HOLD_ID   MISC_ID   RULE_ID   READY
------------------------------------
1         1         1         1       
2         1         2         1       
3         1         3         1       
4         2         4         0      
5         2         1         1

我只想从HOLD中选择每行的READY = 1和RULE_ID在的MISC_ID(在ENABLED =
0的RULE_IDs中)。在上面的示例中,查询应该返回MISC_ID = {1},因为HOLD_ID 1、2和3都具有READY = 1,并且RULE
1、2和3也都被禁用了。

由于HOLD_ID 4的READY = 0,因此不应返回MISC_ID 2。

表MISC和HOLD具有数百万行,但是RULE很小(<1000行)。

关于如何编写本机SQL来实现此目标的任何建议?不能使用PL / SQL。


问题答案:
SELECT MISC_ID
FROM HOLD

GROUP BY MISC_ID
HAVING MIN(READY) <> 0;

示例运行:

$ with HOLD (HOLD_ID, MISC_ID, RULE_ID, READY)
as (values
    (1,1,1,1),
    (2,1,2,1),
    (3,1,3,1),
    (4,2,4,0),
    (5,2,1,1)
)

select MISC_ID
from HOLD

group by MISC_ID
having min(READY) <> 0;

 misc_id
---------
       1
(1 row)

修改查询以处理加入规则:

SELECT HOLD.*, RULE.*

FROM HOLD

INNER JOIN RULE
ON HOLD.RULE_ID = RULE.RULE_ID AND RULE.ENABLED = 0

WHERE MISC_ID IN (
    SELECT MISC_ID
    FROM HOLD

    GROUP BY MISC_ID
    HAVING MIN(READY) <> 0
);


 类似资料:
  • 问题内容: 我有这样设置的表: 如果Child中包含给定parent_id的 所有 行均符合涉及x和y的条件(在我的情况下,x = y),我想找到Parents或不同的parent_id 。 例如: 将会得到3。当前,我有一个查询,查找 任何子级 都符合条件的parent_ids 。然后,我用它来检索那些记录,并在所有子级都符合条件的情况下在代码中检查它们。通过示例数据,我得到parent_id

  • 问题内容: 我有一个将两个选择子句与UNION结合使用的查询。我只想选择第一行。我如何使用Union来做到这一点? 问题答案:

  • 问题内容: 如何编写仅在联接表中的所有关联记录都满足某些条件的情况下才返回记录的SQL查询。 例如,如果A有很多B,我想从A SELECT * WHERE到给定A的所有相关B都具有B.some_val> value 我知道这可能是一个非常基本的问题,因此感谢您的帮助。另外,如果有所作为,我正在使用postgres。 山姆 问题答案: 假设不需要关联,请使用: 如果您确实需要相关性: 解释 在这使得

  • 问题内容: 我的数据库中具有以下结构: 现在,除id以外的所有其他列均为boolean类型。例如说 我正在寻找一种返回列名称为true(= 1)的列名称的方法,因此在此示例中,返回值应类似于 将会有动态的列数,因为经常更改表以添加新列和删除旧列。 到目前为止,我拥有的函数看起来像这样-应该是该函数返回该列名称的字符串… 有什么方法可以使用直接SQL做到这一点?我正在使用MySQL。 问题答案: 如

  • 问题内容: 我想选择位于最右侧的某个字符(-)之后的所有内容。 例如。 我想选择零件 谢谢! 问题答案: 您可以使用:

  • 问题内容: 我有一个包含ID,WorkerID,IsActive标志(1或0)和LocalTime的表。每次工作人员处于活动状态或不活动状态时,都会使用WorkerID,1或0标志记录以及一个时间(LocalTime)创建一条记录。 我想插入一个新表中:从该表中,对于每个唯一的WorkerID,仅当该记录的IsActive标志为1时,才为该唯一的WorkerID选择具有最新LocalTime的记录