2014-03-05 108 views
-1

我有这个SQL查询:SQL Server查询,奇怪的行为

SELECT UserChiamante.UserId as UserId 

FROM Something 

WHERE Something AND 
     UserChiamante.UserId = ChiamanteInterno.UtenteId 

的结果是这样的:

_________________ 
|  UserId |  
|_______________| 
|  1008  | 
|---------------| 
|  1022  | 
|---------------| 
|  1032  | 
|_______________| 

而且它的确定。 但如果我更改查询:

SELECT UserChiamante.UserId as UserId 

FROM Something 

WHERE Something AND 
     UserChiamante.UserId != ChiamanteInterno.UtenteId 

我期待一个不同的结果,但我得到一些奇怪的结果是这样的:

_________________ 
|  UserId |  
|_______________| 
|  1008  | 
|---------------| 
|  1022  | 
|---------------| 
|  1032  | 
|---------------| 
|  1258  | 

的ID 1258是OK的,因为我没有在ChiamateInterno这个ID表,但其他3个在ChiamateInterno表中(obv,你可以从查询的第一个版本中看到)。

OBV“UtenteId”其“用户ID”的外键

那么,为什么这个纪录被选中?

+0

您的查询语法错误。您必须提供完整的查询以更好地理解问题。 –

+0

您可以扩展'Something'和'Something'吗? 您正在实现一个连接,并可能尝试执行一个外连接,但是您几乎可以得到一个笛卡尔产品,因为每行将被另一个表中的几乎所有其他行连接。 –

回答

1

你应该真的显示更多的查询和样本结果。

但是,我敢肯定,问题是你不完全理解联接。毕竟,您甚至没有在on子句中使用正确的join语法。一个很好的猜测是你想排除第二个表中的东西。

您所查询的事:

where UserChiamante.UserId not in (select UtenteId from ChiamanteInterno) 

课程的确切语法和结构可能会有所不同,这取决于查询的其余部分。

+0

那么工作 – Alist3r

0

我相信第一查询看起来是这样的:

SELECT UserChiamante.UserId as UserId 
FROM UserChiamante, ChiamanteInterno 
WHERE UserChiamante.UserId = ChiamanteInterno.UtenteId; 

首先,重写这是一个明确的JOIN

SELECT UserChiamante.UserId as UserId 
FROM UserChiamante JOIN ChiamanteInterno ON 
     UserChiamante.UserId = ChiamanteInterno.UtenteId; 

那么我想你需要在你的第二个查询外连接。所以尝试:

SELECT UserChiamante.UserId as UserId 
FROM UserChiamante LEFT JOIN ChiamanteInterno ON 
     UserChiamante.UserId = ChiamanteInterno.UtenteId 
WHERE UserChiamante.UserId IS NULL; 

或者可能是相反的方式。