从选择查询中排除基于多列的行

Posted

技术标签:

【中文标题】从选择查询中排除基于多列的行【英文标题】:Exclude rows based on multiple columns from select query 【发布时间】:2021-05-05 14:08:12 【问题描述】:

我有一个如下所示的表格:

CREATE TABLE public.mytable (
  p_id varchar(40) NOT NULL,
  j_id varchar(48) NOT NULL,
  u_id varchar(255) NOT NULL
);

我使用以下方法根据 p_id 和 j_id 查找行:

SELECT * FROM mytable WHERE p_id = ? AND j_id = ? LIMIT 10

我想扩展这个查询,让它也排除一些行,例如,我有一个这样的列表:

class MyEntity 
    public p_id 
    public j_id;
    public u_id;


List<MyEntity> rowsToExclude = new ArrayList<>();
rowsToExclude.add(new MyEntity(1, 3, 5));
rowsToExclude.add(new MyEntity(7, 8, 9));

如何将rowsToExclude 输入到查询中,也许使用 NOT IN?

例如,(不是真正的代码),类似:

SELECT * FROM mytable WHERE p_id = ? AND j_id = ? 
AND NOT IN(rowsToExclude)
LIMIT 10

相关:

Select NOT IN multiple columns

Can you use multiple columns for a not in query?

【问题讨论】:

使用主键过滤掉行。表有PK吗? 表没有主键 没有 ORDER 的限制很少有意义。 行被抓取后会被删除,这是在循环中完成的,直到所有行都被删除,所以我认为这里不需要 ORDER BY。 【参考方案1】:

您可以使用八个参数,而不仅仅是两个。

例如,你可以这样做:

SELECT * 
FROM mytable 
WHERE p_id = ? AND j_id = ?
  and (p_id, j_id, u_id) not in ((?, ?, ?), (?, ?, ?))
LIMIT 10

我会假设 135789 是字符串,因为表列是 VARCHAR

注意:此策略不适用于空值。

【讨论】:

谢谢,你有机会知道如何使用像这样的 jdbi fluent api 来做到这一点***.com/a/55921388/12177456

以上是关于从选择查询中排除基于多列的行的主要内容,如果未能解决你的问题,请参考以下文章

SQL根据一列中的最大值从多列中选择不同的行

Primefaces:从p:dataTable中的行选择中排除列

如何使用 group by(基于一列)从表中选择多列,在 hive 查询中具有和计数

基于多列值构建选择结果

进行从多列中选择值列表的 SQL 查询

mysql 从多列中选择值到单列中