SQL查询从两个表中获取不匹配的记录

时间:2014-08-09 11:16:42

标签: sql select join

我有两张表userprofiledeviceid

  • userprofile包含usernamestudentname
  • deviceid包含usernamedevice id

我想从userprofile获取不在deviceidusername)的用户名记录。

我的查询是

SELECT 
    userprofile.username, userprofile.studentname 
FROM 
    userprofile
LEFT JOIN 
    deviceid ON deviceid.username = userprofile.username
WHERE 
    deviceid.username IS NULL;

它没有取任何值。

5 个答案:

答案 0 :(得分:3)

你的措辞实际上是确切的方法:

  

我想从userprofile获取不在deviceid(用户名)

中的用户名记录

现在,我们只需将其放入SQL:

SELECT username 
FROM   userprofile
WHERE  username NOT IN (SELECT username FROM deviceid)

答案 1 :(得分:1)

这就是我通常的做法

select * from userprofile a where not exists (select 1 from device b where a.username = b.username)

答案 2 :(得分:0)

你几乎接近解决方案

SELECT userprofile.username,userprofile.studentname FROM userprofile
  LEFT OUTER JOIN deviceid ON deviceid.username = userprofile.username
  WHERE deviceid.username IS NULL;
UNOIN ALL
SELECT userprofile.username,userprofile.studentname FROM deviceid
  LEFT OUTER JOIN userprofile ON deviceid.username = userprofile.username
  WHERE deviceid.username IS NULL;

其他类型的解决方案试试这个Fiddle

希望这可能有用

答案 3 :(得分:0)

在您的查询中,您正在过滤where子句中的左连接表。这会将左连接更改为内连接。要使用您的方法,请在join子句中进行过滤。在您的具体情况下,您所要做的就是将“where”改为“and”。

Mureinik的回答也会奏效,但可能会很慢。 Hans Kilian的回答也会奏效。

答案 4 :(得分:0)

您需要获取userprofile中的值,然后尝试以下代码

select username,studentname
from userprofile 
where upper(username) not in (select upper(username) from deviceid);

以上查询位于 Oracle 。它将返回不在deviceid中的userprifile的详细信息