首页 文章

MySQL - 选择字段不相等的行

提问于
浏览
0

我对SQL查询有一点问题:我的'TableA'有一个字段'TableA.b',其中包含'TableB'的ID . 我想从'TableB'中选择没有ID等于任何字段'TableA.b'的所有行 . 换句话说,我需要来自TableB的每一行,而不是TableA中任何行所引用的那一行 . 我试过像这样的查询:

SELECT DISTINCT TableB.* FROM TableA, TableB Where TableA.b != TableB.ID

但结果包含一个也由否定返回的行,即两个字段具有相同值的行 . 有任何想法吗?

5 回答

  • 1

    首先,从 TableA 中选择所有ID:

    SELECT DISTINCT b FROM TableA
    

    然后使用该结果通过使用上述查询作为子查询选择 TableB 中具有此set中不存在的id的所有行:

    SELECT * FROM TableB WHERE ID NOT IN (SELECT DISTINCT b FROM TableA)
    

    希望这可以帮助 .

  • 0

    在SELECT Query中使用 NOT IN .

    SELECT * FROM TableB t1 WHERE t1.ID NOT IN (SELECT t2.b FROM TableA t2);
    
  • 0

    你需要的是LEFT (or RIGHT) JOIN .

    SELECT TableB.* FROM TableA 
      LEFT JOIN TableB on TableA.b = TableB.ID
        WHERE TableA.b IS NULL
    

    虽然可以使用子查询来执行相同的操作,但在某些otehr答案中也是如此 . 联接通常是faster .

    LEFT [OUTER] JOIN可能比同等的子查询更快,因为服务器可能能够更好地优化它 - 这个事实并非仅针对MySQL Server . 在SQL-92之前,外连接不存在,因此子查询是执行某些操作的唯一方法 . 今天,MySQL Server和许多其他现代数据库系统提供了广泛的外连接类型 .

  • 0

    你可以试试这个

    SELECT TableB.* FROM TableB
      WHERE ID NOT IN
           (SELECT b from TableA);
    
  • 0

    您也可以使用右连接 . 试试这个:

    SELECT DISTINCT TableB.* FROM  tablea RIGHT JOIN TableB ON TableA.b = Tableb.ID WHERE TableA.B IS NULL
    

相关问题