我试图从table1获取数据,将其字段与table2进行比较,其中两个值都不相等
news:
--
id, title
1 test
2 teeest
3 tet
newsseen:
id, newsId
1 1
2 2
以下是!=
的查询,
SELECT n.id, n.title, n.CreatedOn FROM news n , newsseen ns WHERE n.id != ns.newsId group by n.id;
它返回新闻表中的所有数据,而不是仅返回第3行
但如果我查看=
SELECT n.id, n.title, n.CreatedOn FROM news n , newsseen ns WHERE n.id = ns.newsId group by n.id;
只返回前2行。
我可以知道为什么并且可以得到解决方案吗?
答案 0 :(得分:2)
您正在寻找NOT EXISTS
SELECT n.id, n.title, n.CreatedOn
FROM news n
WHERE Not exists (select 1 from newsseen ns where n.id = ns.newsId )
在您的第一个查询中,对于Id
表中的第一个news
(即)1
。根据您的条件n.id != ns.newsId
,newsseen
表中有一条记录不相等(即)newsId = 2
,因此将返回ID=1
。
类似于Id=2
表中的news
,newsId=1
表中存在不匹配的记录(即)newsseen
,因此Id=2
也将被返回。
Id=3
表格中的news
,这两条记录在newsseen
中都不匹配,因此Id=3
也将返回
答案 1 :(得分:1)
这是正确的做法。你想要的是做一个基于集合的"平等,看看是否匹配。这需要LEFT JOIN
:
SELECT n.id, n.title, n.CreatedOn
FROM news n LEFT JOIN
newsseen ns
ON n.id = ns.newsId
WHERE ns.newsId IS NULL;
我认为没有理由GROUP BY
。
并且,我应该添加我的常用:从不在FROM
子句中使用逗号。 始终使用明确,正确的JOIN
语法。
(您也可以使用NOT EXISTS
和NOT IN
轻松表达这一点,但您的方法建议LEFT JOIN
。这三者的表现应该相似。)