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

时间:2015-07-20 20:49:27

标签: sql ms-access-2010

我在表格中有一个列,其中包含逗号分隔的值(课程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);

2 个答案:

答案 0 :(得分:0)

尝试

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

答案 1 :(得分: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' );

我能想到两种解决方案。

第一种更好的方法是不使用逗号分隔字段,而是在学生表和课程表之间创建链接表(多对多关系)。链接表包含学生的键和学生可以访问的课程。然后,您可以加入学生,链接表,然后将链接表加入课程。

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

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