我有两张表,例如汽车和修理。在这两个表中,我都有"licensePlate"列。在表cars
中,我的值为:0000 0001 0002 0003在表repair
中,我的值为:0000 0002 0003。如何仅提取表cars
中的值0001而不提取表repair
中的值?我想我没有使用正确的"运算符"或类似的东西:
select car.licensePlate
from car, repair
where car.licensePlate (something) reparir.licensePlate;
您应该使用NOT EXISTS
或LEFT JOIN
,如:
select c.licensePlate
from car c
where not exists (select 1 from repair r where c.licensePlate = r.licensePlate;
您特别应该不要使用NOT IN
,因为如果子查询在任何行上返回NULL
值,则它具有奇怪的语义(即行为怪异(。当这种情况发生时,外部查询将不返回任何行。
出于这个原因,我强烈建议使用NOT EXISTS
而不是带有子查询的NOT IN
。
您可以使用not in
运算符:
SELECT licensePlate
FROM car
WHERE licensePlate NOT IN (SELECT licensePlate
FROM repair)
使用NOT IN运算符应该可以解决您的问题。它的工作方式是:
选择CAR.LICENSEPLATE其中CAR.licenseeplate不在(选择REPAIR.LICENSEPLATE FROM REPAIR(
当执行此查询时,它将被读取为:选择CAR.LICENSEPLATE其中CAR.LICNESEPLATE不在(0000000 20003(中
这是因为在由子查询组成的任何查询中,子查询都会首先执行,在这种情况下是SELECT REPAIR.LICENSEPLATE FROM REPAIR,并且子查询的结果会传递给主查询。这就是上面提到的问题的总结。
希望能有所帮助。干杯