我有这个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”的外键
那么为什么选择这条记录呢?
答案 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;
或者可能反过来。