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所说,这是有效的,谢谢!