sql:如何判断一笔单完全满足某个条件
现有链接主从表视图,字段gsbh,cpbm分别是生产单号 产品编码,
现在要判断一笔生产单号是否是纯打模单,即生产单号里的产品编码
全部是'DM'开头,不能有其他的非'DM'开头的产品在里面.
第一步:找出每一单中DM开头的记录数
SELECT gsbh, COUNT(*) AS sl
FROM pcb
WHERE cpbm LIKE 'DM%'
GROUP BY gsbh
第二步:找出每一单中的记录数,只要DM开头的记录数与总记录数相等,表示是纯DM单,即打模单
SELECT gsbh, COUNT(*) AS sl
FROM pcb
GROUP BY gsbh
第三步,将上面的数据集串联起来,得到纯DM单号,这就是纯打模单单号了,
有了单号,将下面的sql封装成新的视图,取名为vDmOnly
SELECT gsbh
FROM (SELECT gsbh, COUNT(*) AS sl
FROM pcb
WHERE cpbm LIKE 'DM%'
GROUP BY gsbh) a
WHERE EXISTS
(SELECT gsbh, sl
FROM (SELECT gsbh, COUNT(*) AS sl
FROM pcb
GROUP BY gsbh) b
WHERE a.gsbh = b.gsbh AND a.sl = b.sl)
第四步,得到所有纯打模的单
select * from 订单主从表 where exists (select * from vDmOnly where 订单主从表.gsbh=vDmOnly.gsbh)
总结:第三步没有加限制条件,比如订单日期,因此,记录很多速度会很慢.
现在要判断一笔生产单号是否是纯打模单,即生产单号里的产品编码
全部是'DM'开头,不能有其他的非'DM'开头的产品在里面.
第一步:找出每一单中DM开头的记录数
SELECT gsbh, COUNT(*) AS sl
FROM pcb
WHERE cpbm LIKE 'DM%'
GROUP BY gsbh
第二步:找出每一单中的记录数,只要DM开头的记录数与总记录数相等,表示是纯DM单,即打模单
SELECT gsbh, COUNT(*) AS sl
FROM pcb
GROUP BY gsbh
第三步,将上面的数据集串联起来,得到纯DM单号,这就是纯打模单单号了,
有了单号,将下面的sql封装成新的视图,取名为vDmOnly
SELECT gsbh
FROM (SELECT gsbh, COUNT(*) AS sl
FROM pcb
WHERE cpbm LIKE 'DM%'
GROUP BY gsbh) a
WHERE EXISTS
(SELECT gsbh, sl
FROM (SELECT gsbh, COUNT(*) AS sl
FROM pcb
GROUP BY gsbh) b
WHERE a.gsbh = b.gsbh AND a.sl = b.sl)
第四步,得到所有纯打模的单
select * from 订单主从表 where exists (select * from vDmOnly where 订单主从表.gsbh=vDmOnly.gsbh)
总结:第三步没有加限制条件,比如订单日期,因此,记录很多速度会很慢.