SQLite-如何从一个表中选择不在另一个表中的记录

SQLite-如何从一个表中选择不在另一个表中的记录,sql,sqlite,join,select,subquery,Sql,Sqlite,Join,Select,Subquery,我有一个包含3个表的数据库;TBL客户、TBL图书、TBL灯光 我想从Customers表中查找客户的姓氏(LName),客户不在bookings表中。它应该只返回三个名称,但每个名称返回10次。bookings表中有10条记录,因此我认为该命令返回了正确的名称,但不是一次 我试过: SELECT tblCustomers.LName FROM tblCustomers, tblBookings WHERE tblCustomers.CustID NOT IN (SELECT CustID F

我有一个包含3个表的数据库;TBL客户、TBL图书、TBL灯光

我想从Customers表中查找客户的姓氏(LName),客户不在bookings表中。它应该只返回三个名称,但每个名称返回10次。bookings表中有10条记录,因此我认为该命令返回了正确的名称,但不是一次

我试过:

SELECT tblCustomers.LName
FROM tblCustomers, tblBookings
WHERE tblCustomers.CustID 
NOT IN (SELECT CustID FROM tblBookings)
如何只返回名称的一个实例,而不是重复10次的名称?

外部查询中bookings表上的(隐式)
交叉连接没有意义-它会乘以客户行

此外,我建议使用
不存在
进行过滤,而不是
不在
中:它通常性能更好-有正确的索引,并且
为空
-安全:

SELECT c.LName 
FROM tblCustomers c
WHERE NOT EXISTS (SELECT 1 FROM tblBookings b WHERE b.CustID = c.CustID)
为了提高性能,请确保在
tblBookings(CustID)
上有一个索引-如果您声明了正确的外键,它应该已经在那里了。

外部查询中bookings表上的(隐式)
交叉连接没有意义-它会乘以客户行

此外,我建议使用
不存在
进行过滤,而不是
不在
中:它通常性能更好-有正确的索引,并且
为空
-安全:

SELECT c.LName 
FROM tblCustomers c
WHERE NOT EXISTS (SELECT 1 FROM tblBookings b WHERE b.CustID = c.CustID)

为了提高性能,请确保在
tblBookings(CustID)
上有一个索引-如果您声明了正确的外键,它应该已经存在了。

您正在对两个表进行交叉联接。
仅在以下情况下使用:

SELECT LName 
FROM tblCustomers 
WHERE CustID NOT IN (SELECT CustID FROM tblBookings)

您正在对两个表进行交叉联接。
仅在以下情况下使用:

SELECT LName 
FROM tblCustomers 
WHERE CustID NOT IN (SELECT CustID FROM tblBookings)

对不起,你能解释一下“b”和“c”吗?它可以工作,但我不确定这是什么…@StTebb:这些是查询中使用的表的别名。它们使查询更易于阅读和编写。对不起,你能解释一下“b”和“c”吗?它可以工作,但我对此不确定…@StTebb:这些是查询中使用的表的别名。它们使查询更易于读写。