在纯MYSQL中,这可能是完全不可能的,但希望有人能给我们一些启示。
基本上,我正在尝试创建一个计划,它将在一个表上进行测试,并更新一个新的表,或者清除或未清除。
以下是表-测试件的快照
TEST_NO RING ROUTE TYPE_NO
7256 BT1 TSTS 390397
7257 BT1 TCRT 390397
7258 BT1 TCRT 390397
7259 BT1 TCRT 390397
7260 BT1 TCRT 390397
7261 BT1 TCRT 390397
7262 BT1 TCRT 390397
7263 BT1 TCRT 390397
7264 BT1 TCRT 390397
7265 BT1 TCRT 390397
7266 BT1 TCRT 390397
7267 BT1 TCRT 390418
7268 BT1 TCRT 390418
7269 BT1 TCRT 390418
7270 BT1 TCRT 390418
7271 BT1 TCRT 390418
7272 BT1 TCRT 390418
7273 BT1 TCRT 390418
7274 BT1 TCRT 390418
7275 BT1 TCRT 390418
7276 BT1 TCRT 390418
7277 BT1 TCRT 390418我试图实现的是检查每个TYPE_NO的所有路由值,如果路由的所有值都是TCRT,那么这将是正确的,或者如果一个值是TSTS,其余的值是TCRT,那么这将是假的。
从表1中可以看到,TYPE_NO 390397未被清除,因为并非所有的路由值都是TCRT,其中一个仍然是TSTS。第二个type_no 390418有一个所有TCRT的路由,这意味着Type_no已被清除。
因此,我需要更新另一个名为TypeCleared的表,结果如下所示。
TYPE_NO TYPE_CLEARED
390397 UNCLEARED
390418 CLEARED因此,假设TypeCleared表中有一个包含单个Type_no的列,而Type_Cleared字段是空的。
我试过以下方法-
UPDATE TYPECLEARED SET TYPECLEARED.TYPE_CLEARED = "CLEARED" WHERE TYPECLEARED.TYPE_NO = TESTPIECES.TYPE_NO AND ROUTE = "TCRT" ;
UPDATE TYPECLEARED SET TYPECLEARED.TYPE_CLEARED = "UNCLEARED" WHERE TYPECLEARED.TYPE_NO = TESTPIECES.TYPE_NO AND ROUTE NOT IN ("TCRT");这个sql使表看起来如下所示
TYPE_NO TYPE_CLEARED
390397 UNCLEARED
390397 CLEARED
390418 CLEARED因此,在这种情况下,我认为是否有某种方法可以使用用户定义的变量来创建IF Else语句。
SET @PIECES = (SELECT count(test_no) from live_testpiec group by TYPE_NO);
SET @ROUTE = (SELECT count(ROUTE) from live_testpiec WHERE ROUTING_POS = 'TCRT' group by TYPE_NO);使用变量,我可以做一个评估,如果@ update = @ROUTE然后将该TYPE_NO更新为已清除,否则将未清除。
尽管,当我试图设置这些变量时,我得到了以下错误-
Subquery returns more than 1 row 这意味着我不能在type_no上使用group by,但是这对于评估每一组TYPE_NO绝对是至关重要的。
做我想要达到的目标还有其他的方法吗?希望这有意义!
任何问题请问
发布于 2015-04-21 17:31:05
http://sqlfiddle.com/#!9/f4af8/2
UPDATE TypeCleared
INNER JOIN (
SELECT TYPE_NO, SUM(IF(ROUTE='TSTS',1,0)) as criteria
FROM testpieces
GROUP BY TYPE_NO
) t
ON TypeCleared.TYPE_NO = t.TYPE_NO
SET TYPE_CLEARED = IF(t.criteria=0,'CLEARED','UNCLEARED')https://stackoverflow.com/questions/29778020
复制相似问题