2016-04-30 67 views
0

我对SQL查询有一个小问题:我有'TableA'字段'TableA.b',其中包含'TableB'的ID。我想选择'TableB'中没有ID等于任何字段'TableA.b'的所有行。换句话说,我需要TableB中的每一行,这些行在TableA中的任何行都没有引用。 我想这样的查询:MySQL - 选择字段不相等的行

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

但结果包含也被否定,即返回其中两个字段具有相同值的行。 任何想法?

+0

提交的答案是否有帮助? – e4c5

回答

1

你需要的是LEFT (or RIGHT) JOIN

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

尽管可以像子查询一样在某些otehr答案中执行相同的操作。加入经常是faster

左[外]连接可以比同等的子查询更快,因为 服务器可能能够优化更好,事实上,本身并不是具体 到MySQL服务器。在SQL-92之前,外连接并不存在 ,所以子查询是做某些事情的唯一方法。今天,MySQL服务器和许多其他现代数据库系统提供了广泛的外部连接类型 。

0

你可以试试这个

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

首先,从TableA选择所有ID:

SELECT DISTINCT b FROM TableA 

然后使用该结果在TableB选择所有行有一个不存在的ID在此集合中,通过使用上述查询作为子查询:

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

希望这会有所帮助。

0

在SELECT查询中使用NOT IN

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

这可能是解决方案,但如果内部选择结果包含空值,看起来像我得到一个空的结果。 – user1563232

+0

'@ user1563232'不可能。内部选择给出空行或行数。 NULL在上面的查询中是不可能的。 – Vijay

+0

如果你想要tableB的数据比不需要使用tableA进行内部或左连接。 – Vijay

0

你也可以使用正确的连接。 试试这个:

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