【问题标题】:Mysql Query On JoinsMysql 查询加入
【发布时间】:2015-07-04 08:19:00
【问题描述】:

我有两张桌子

表1

      SNO RECEIVER USER1 USER2
      1   133       44   45
      2   144       66   77
      3   155       77   33

表2

     RECEIVER USER
     133      44
     133      45
     144      88
     144      55
     155      77

必填: 从 table1 中删除 table2 中没有匹配条目的所有行

例子

     2   144       66   77

应该被删除 因为 table2 上没有 144 66 行

155 33

我试过了,但没用 从 TABLE1 中删除 A LEFT JOIN TABLE2 B ON(A.RECEIVER=B.RECEIVER AND A.USER1=B.USER)且 B.USER 为 NULL;

【问题讨论】:

  • 我知道加入,但这似乎太难了

标签: mysql mysql5


【解决方案1】:

您也可以在 DELETE 语句中使用 JOIN。以下语句连接(使用左连接!)两个表,从表 2(WHERE ...)中选择没有相应记录的结果行,并从 t1 中删除相应的行:

DELETE t1
FROM t1 LEFT JOIN t2 ON (t1.RECEIVER = t2.RECEIVER AND t1.USER1 = t2.USER)
WHERE t2.RECEIVER IS NULL

请参阅manual 以获取参考,尤其是“多表删除”部分。

【讨论】:

    【解决方案2】:

    为什么需要JOIN 这样做,而不是使用SUB-QUERY

     DELETE FROM  table1
         WHERE receiver NOT IN ( SELECT DISTINCT (receiver) FROM table2 )
         AND user1 NOT IN ( SELECT DISTINCT (user) FROM table2 );
    

    【讨论】:

      【解决方案3】:
      Delete * from Table1 
      Where not exists (select 1 from Table2 where 
      RECEIVER =  Table1.RECEIVER and (user = Table1.user1 or user = Table1.user2))
      

      澄清不匹配的含义。你认为匹配什么。在我上面的回答中,我假设匹配意味着相同的接收器,并且 user1 或 user2 与表 2 中的用户相同。如果不是这种情况,可以修改查询。

      【讨论】:

        【解决方案4】:

        喜欢的东西:

        SELECT t1.sno FROM table1 t1 LEFT JOIN table2 t2 ON t1.receiver = t2.receiver and 2.user = t1.user1 WHERE t2.receiver IS NULL;
        

        上面的查询通过接收者和用户列连接这两个表,并只选择那些没有匹配记录的记录(left join 从 table1 中选择所有记录,而WHERE t2.receiver IS NULL 将只选择那些没有匹配记录的记录表2)

        现在可以了

        delete from table1 where sno IN (__PASTE_ABOVE_QUERY__);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-07-20
          • 2011-12-23
          • 1970-01-01
          • 2013-12-14
          • 2012-10-06
          • 2013-05-18
          相关资源
          最近更新 更多