(SQL)如何从表1中选择除表2中的id之外的所有字段?

时间:2017-05-20 18:29:11

标签: sql

我有3张桌子。

Users:
id__| login__
--------------
_1__| root
_2__| admin
_3__| user

Table 1
id__ | name__ | data_
---------------------
1____| name1__| data1
2____| name2__| data2
3____| name3__| data3
4____| name4__| data4

Table2
id__ | table1_id_| user_id
---------------------------
1____| ____3_____| ___3___
2____| ____2_____| ___3___
3____| ____2_____| ___1___
4____| ____3_____| ___1___

我想知道'和'数据'来自table1除了来自table2的属于users.id = 3的ids,这意味着我需要得到这个: 表结果(table1中的所有字段)(user_id = 3的结果)(对于user_id = 1的结果,btw必须相同):

期望的输出:

id__| name__ | data_
--------------------
1___| name1__| data1
4___| name4__| data4
---------------------

我应该使用什么SQL查询?

2 个答案:

答案 0 :(得分:2)

虽然您可以使用NOT IN解决此问题,但我建议改为使用NOT EXISTS

SELECT t1.*
FROM table1 t1
WHERE NOT EXISTS (SELECT 1
                  FROM table_2 t2
                  WHERE t2.table1_id = t1.id AND t2.user_id = 3
                 );

为什么呢?如果任何 NOT IN值为table1_id,则NULL会表现得相当奇怪。如果发生这种情况,则NOT IN仅返回false并NULL - never 返回true。因此,即使一个列值为NULL,也不会返回任何行。

另一方面,

NOT EXISTS表现得更直观,因此您不必担心这种情况。

答案 1 :(得分:0)

如果我理解正确,这应该是你想要的:

SELECT * FROM table1 WHERE id NOT IN (SELECT table1_id FROM table2 WHERE user_id = 3);