Python 使用时SELECT语句未返回正确的值!=(sqlite3)
我有两张表,销售代表和不可用日期:Python 使用时SELECT语句未返回正确的值!=(sqlite3),python,sql,python-3.x,sqlite,Python,Sql,Python 3.x,Sqlite,我有两张表,销售代表和不可用日期: import sqlite3 booking = sqlite3.connect('AppointmentBookingSystem.db') booking.execute('''CREATE TABLE SALES_REP (repID INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT NOT NULL COLLATE NOCASE, numberOfAppo
import sqlite3
booking = sqlite3.connect('AppointmentBookingSystem.db')
booking.execute('''CREATE TABLE SALES_REP
(repID INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL COLLATE NOCASE,
numberOfAppointments INT DEFAULT 0,
FOREIGN KEY (username) REFERENCES USERNAME_PASSWORD(username));''')
booking.execute('''CREATE TABLE UNAVAILABLE_DATES
(dateID INTEGER PRIMARY KEY AUTOINCREMENT,
date DATE NOT NULL);''')
这两个表之间的关系是多对多的,因此我创建了一个带有复合主键的链接表:
booking.execute('''CREATE TABLE DATES_REPS
(dateID INTEGER NOT NULL,
repID INTEGER NOT NULL,
PRIMARY KEY(dateID, repID),
FOREIGN KEY (dateID) REFERENCES UNAVAILABLE_DATES(dateID),
FOREIGN KEY (repID) REFERENCES SALES_REP(repID));''')
我正在尝试使用SQL select语句从SALES_REP获取不可用_DATES表中该日期不存在的所有RepID的列表
date = 2015-09-25
c = booking.cursor()
cursor = c.execute('SELECT SALES_REP.repID FROM SALES_REP, DATES_REPS, UNAVAILABLE_DATES\
WHERE UNAVAILABLE_DATES.date=? AND UNAVAILABLE_DATES.dateID = DATES_REPS.dateID AND SALES_REP.repID != DATES_REPS.repID', (date,))
IDs = c.fetchall()
当我在DATES_REPS表中只有一条记录时,这将按预期工作
SALES_REP TABLE
repID
------
1
2
3
UNAVAILABLE_DATES TABLE
dateID | date
---------------
1 2015-09-25
DATES_REPS
dateID | repID
-------------------
1 1
返回:
IDs = [(2,), (3,)]
但是,将另一条记录添加到DATES_REPS和UNAVAILABLE_DATES表后,select语句不再正常工作
SALES_REP TABLE
repID
------
1
2
3
UNAVAILABLE_DATES TABLE
dateID | date
---------------
1 2015-09-25
2 2015-09-25
DATES_REPS
dateID | repID
-------------------
1 1
2 2
我现在期望得到的是'3',但我得到的是
IDs = [(1,), (2,), (3,), (3,)]
当我向不可用日期和日期代表添加更多记录时,这种模式将继续
我认为正在发生的是销售代表repID!=为DATES_REPS表中的每条记录返回DATES_REPS.repID,因此当1存在时,返回2和3,当2存在时,返回1和3等,而不是此日期的整个表中不存在的repID
这与我的表的连接方式有关吗?或者我的select语句中有问题?您已经正确推断出SQL是如何计算查询的 如果要检查某些行是否不存在,应将not EXISTS与以下命令一起使用: 选择repID 来自销售代表 如果不存在,请选择1 从日期开始 使用dateID加入不可用的\u日期 不可用的位置\u DATES.date=? 和SALES_REP.repID=日期_REPS.repID
仅仅为了一次约会而建立多对多关系是不寻常的。您的设计可以更简单,只需两个表:
SalesPerson: ID, Name, ...
SalesPersonUnavailable: SalesPersonID, Date
主键位于salersonid上,日期表示一致性
现在您可以进行如下查询:
select name
from SalesPerson sp
where not exists
(
select *
from SalesPersonUnavailable spu
where spu.Date = ?
and sp.ID = spu.SalesPersonID
)
试试这个,而不是=这将返回相同的结果houldn't!=be=销售代表中的销售代表DATES_REPS.repID?刚刚尝试了这个并更改了!=正如@Andomar所说,这是有效的,谢谢!