我在表格中有一个列,其中包含逗号分隔的值(课程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);
答案 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语句然后执行它的变量。如果任何人都可以在该字符串列中放置任何类型的数据,这可能非常非常有问题,我建议不要这样做。
使用适当规范化的数据正确设计数据库。