【发布时间】:2020-01-20 21:36:27
【问题描述】:
以下查询在 SQLite 中适用于我。
SELECT Id, (SELECT Id
FROM Vehicles v
WHERE v.Id = t.VehicleId) AS VehId
FROM Transactions t
WHERE t.VehicleId IS NOT NULL AND VehId IS NULL;
但是在 SQL Server 中,它给了我一个错误。
列名“VehId”无效。
编辑器在最后一个VehId(但不是第一个)下面放了一条红色波浪线。
如您所料,Vehicles.Id 是主键。我试图在Transactions 中找到所有不引用Vehicles 中任何行的外键。完成此任务的最佳方法是什么?
【问题讨论】:
-
这对我来说看起来像是一个古怪的反加入。由于表的 ID 决不能为空(否则它不会是它的 ID),所以只有当
Transactions.VehicleId在Vehicles表中没有匹配项时,您才能获得空值。但是你正在寻找VehicleId,只有那些不是空的,另一个表的ID应该总是有一个外键来保证数据的一致性。所以,你有一个损坏的数据库,想要找到无效的行,是吗?典型的方法是使用NOT EXISTS或NOT IN进行此类查找。
标签: sql sql-server sqlite tsql join