我在数据库中有两个表,看起来像这样
课程:
档案:
在此设置中,我可以拥有一个给定的课程,我可以为任何课程提供多个相关的项目。每个课程没有统一的项目数。我是否需要执行单独的查询来为每个课程提取所有相关项目,或者我可以在1个选择语句中执行此操作而不返回冗余信息吗?
答案 0 :(得分:1)
without returning redundant information
?如果你的意思是不重复课程细节,那么不 - 不容易在一个查询中。 有一些可怕的查询(就想法和代码而言)以返回以下内容:但我不建议去探索它。
ixCourse, enType .. , ixItem, sDescription
1 1 1 first for course 1
2 Second for course 1 << notice no course details
2 1 3 first for course #2
但通常的做法是在两个产生
之间加入ixCourse, enType .. , ixItem, sDescription
1 1 1 first for course 1
1 1 2 Second for course 1 << course details repeated per item
2 1 3 first for course #2
对此类的查询将是
select c.*, i.*
from course c
left join item i on c.ixCourse = i.ixCourse
我在这里使用了LEFT JOIN
,这可能会产生这种情况(例如,课程2没有项目)
ixCourse, enType .. , ixItem, sDescription
1 1 1 first for course 1
1 2 Second for course 1 << course details repeated
2 1 NULL NULL << nothing for item columns
3 1 4 first for course #3
将其更改为INNER JOIN
(或缩写为JOIN
)将删除没有说明的课程。
答案 1 :(得分:0)
只需使用加入:
SELECT * FROM Course C
JOIN Item I ON C.ixCourse=I.ixCourse
是的,您将重复学习课程信息..没有办法只返回一行课程数据,然后返回多个项目行而不进行两次查询。如果这就是你要问的话,你可以在一个查询中只返回一门课程的价值。
答案 2 :(得分:0)
目前还不清楚你想要什么作为输出,但是这个:
SELECT c.*, i.*
FROM COURSE c
LEFT JOIN ITEM i ON i.ixcourse = c.ixcourse
...将返回所有课程以及与课程相关的任何项目。如果课程没有与之相关的项目,则输出中的ITEM列将为NULL。也就是说,如果有多个与之相关的项目,课程列将保留重复值 - 但ITEM列将有所不同。
如果您只想要包含项目的课程列表,请使用:
SELECT c.*, i.*
FROM COURSE c
JOIN ITEM i ON i.ixcourse = c.ixcourse