SQL服务器查询,奇怪的行为

时间:2014-03-05 14:29:17

标签: sql sql-server

我有这个SQL查询:

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没关系,因为我在ChiamateInterno表中没有这个ID,但是其他3个在ChiamateInterno表中(obv,你可以从查询的第一个版本看到)。

Obv“UtenteId”是“UserId”的外键

那么为什么选择这条记录呢?

2 个答案:

答案 0 :(得分:1)

您应该真正展示更多的查询和示例结果。

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

对于您的查询,请执行以下操作:

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

当然,确切的语法和结构可能会有所不同,具体取决于查询的其余部分。

答案 1 :(得分: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;

或者可能反过来。