在查询中使用列的逗号分隔值

Use comma-delimeted values of a column in a query

我在 table 中有一列具有逗号分隔值(课程 ID),我试图在下面的查询中使用它.... IN (students.courseids)

它不起作用:-)

如果我用 IN(1,3,9) 替换列值,它工作正常。

在此先感谢您的帮助!

SELECT DISTINCT students.Student_Name, students.grade_ID, books.book_title, books.price
FROM (books INNER JOIN courses ON books.course_ID = courses.course_ID) 
      INNER JOIN students ON courses.grade_ID = students.grade_ID
WHERE (students.ID)=3 AND CStr(books.course_ID) IN(students.courseids);

尝试

SELECT DISTINCT 
    students.Student_Name, students.grade_ID, 
    books.book_title, books.price 
FROM 
    (books 
INNER JOIN 
     courses ON books.course_ID = courses.course_ID) 
INNER JOIN 
    students ON courses.grade_ID = students.grade_ID 
WHERE 
    (students.ID) = 3 
    AND InStr(CStr(books.course_ID), students.courseids) > 0

您遇到的问题是 IN 子句在这种情况下没有用。你拉取的值是一个单一的值,所以对于引擎而言,你只是在寻找右边的一项,而不管字符串中有多少个逗号:

SELECT DISTINCT
        students.Student_Name ,
        students.grade_ID ,
        books.book_title ,
        books.price
FROM    ( books
          INNER JOIN courses ON books.course_ID = courses.course_ID
        )
        INNER JOIN students ON courses.grade_ID = students.grade_ID
WHERE   ( students.ID ) = 3
        AND CStr(books.course_ID) IN ( '9,1,2' );

当你想说什么,但不能这样说时,

SELECT DISTINCT
        students.Student_Name ,
        students.grade_ID ,
        books.book_title ,
        books.price
FROM    ( books
          INNER JOIN courses ON books.course_ID = courses.course_ID
        )
        INNER JOIN students ON courses.grade_ID = students.grade_ID
WHERE   ( students.ID ) = 3
        AND CStr(books.course_ID) IN ( '9','1', '2' );

我能想到的解决方案有两种。

第一个也是更好的方法是不使用逗号分隔字段,而是在学生 table 和课程 [=25] 之间创建一个链接 table(也称为多对多关系) =].链接 table 包含学生的密钥和学生有权访问的课程。然后您加入学生,链接 table,然后链接 table 到课程。

第二种不太好(也很危险)的可能性是创建一个包含 sql 语句的变量,然后执行它。如果任何人都可以在该字符串列中放入任何类型的数据,这可能会非常非常有问题,我建议不要这样做。

正确设计您的数据库,使用适当规范化的数据。