使用IF语句MYSQL更新列

时间:2015-04-21 16:28:02

标签: mysql

在纯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的每一组绝对至关重要。

有没有其他方法可以实现我想要实现的目标..希望这是有道理的!

如有任何问题,请

1 个答案:

答案 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')