我有一个包含如下所示值的表

Sno orderno partno
101 OCT1 oRing
101 OCT1 Gasket
101 OCT1 Case
101 OCT2 gRing
101 OCT2 Gasket
101 OCT2 Cover
101 OCT3 Case
101 OCT3 Gasket
102 OCT1 Gasket

我要删除每个SNO的所有订单(OCT1、OCT2、OCT3)中共有的值.输出还应该包括orderno,如下所示.在这里,垫圈是可用的所有订单101,所以我想删除它,但情况是只有2个顺序使用3,所以我不能删除它.

Sno orderno partno
101 OCT1 oRing
101 OCT1 Case
101 OCT2 gRing
101 OCT2 Cover
101 OCT3 Case
102 OCT1 Gasket

我try 了下面的代码,但不起作用.请帮助/建议

select * from mytable where partno not in (
select max(partno) from mytable
group by sno
having count(orderno)=count(partno))

推荐答案

我们可以try 以下方法.第一个CTE查找每个Sno个订单中的不同订单数量.然后,在第二个CTE中,我们还可以找到产品在给定的Sno次内出现的次数.匹配记录是指产品并未出现在每个订单中的记录.

WITH cte1 AS (
    SELECT Sno, COUNT(DISTINCT orderno) AS ordernocnt
    FROM mytable
    GROUP BY Sno
),
cte2 AS (
    SELECT t1.*, t2.ordernocnt,
           COUNT(*) OVER (PARTITION BY Sno, partno) partcnt
    FROM mytable t1
    INNER JOIN cte1 t2 ON t2.Sno = t1.Sno
)

SELECT Sno, orderno, partno
FROM cte2
WHERE partcnt < ordernocnt OR ordernocnt = 1
ORDER BY Sno, orderno;

Sql相关问答推荐

按CTE创建任务表

如何使用PostGIS从单个表中 Select 所有相交面组

在Golang中管理数据库事务的简洁方法

不同表达方式时的大小写

导出部分条形码字符串GS1-128

如何使用SQL Server中的Nodes()方法执行与OPENXML相同的操作

PATINDEX中与[A-Z]匹配(U除外)的正则表达式

在SQL中将项分配给容器

删除所有订单中可用的重复值

Proc SQL Select Distinct SAS

用替代方案替换 SQL Cursor 以提高性能

没有调用子查询的嵌套 JOIN语法是什么?

SQL:考虑合并分支计算分支的增长百分比

在SQL中实现表格数据透视类型报表

如何将输出转换为二维格式?

在 MS Access VBA 中,如何测量显示查询的时间?

如何将多行的查询结果合并为一行

SQL 计数和过滤查询优化

每组跨行曲折?

连续日期的SQL