在纯MYSQL中这可能是完全不可能的,但希望有人可以说清楚。
基本上我正在尝试创建一个计划,该计划将对表进行测试并使用Cleared OR Uncleared更新新表。
以下是表格的快照 - testpieces
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的所有ROUTE值,如果ROUTE的所有值都是TCRT那么这是真的,或者如果一个值是TSTS而其余的是TCRT那么这将是是假的。
从表1可以看出TYPE_NO 390397未清除,因为并非所有ROUTE值都是TCRT,一个仍然是TSTS。第二个type_no 390418具有所有TCRT的ROUTE,这意味着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);
使用变量我可以进行评估,如果@PIECES = @ROUTE则将TYPE_NO更新为已清除,否则为未清除。
虽然,当我尝试设置这些变量时,我收到以下错误 -
Subquery returns more than 1 row
意思是我不能在type_no上使用group by,但这对评估TYPE_NO的每一组绝对至关重要。
有没有其他方法可以实现我想要实现的目标..希望这是有道理的!
如有任何问题,请
答案 0 :(得分:3)
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')