基于FK解析属性

时间:2014-02-25 15:39:55

标签: mysql sql

我正在尝试编写一个SQL查询,该查询返回大学课程的模块编号及其标题列表,以及该模块及其标题的先决条件列表。这意味着输出应该类似于:

Module | Module Title | Prerequisite | Prerequisite Title
C1930  | Computing    | C1100        | Basic Computing
C1930  | Computing    | C1500        | Intermediate Computing
T1350  | Textiles     | T1100        | Sewing

表格类型如下:

模块( moduleNumber ,moduleName);

先决条件( moduleNumber prerequisiteNumber );

我的问题是将prerequisteNumber解析为moduleName。我可以看到它可能需要是子查询或使用某种类型的JOIN(INNER JOIN是我尝试过的方式),但我似乎无法让它工作。

我的查询尝试如下:

SELECT m.moduleNumber as "Module", m.moduleName as "Module Title", p.moduleNumber as "Prerequisite", p.prerequisiteNumber as "Prerequisite Title"
FROM Module m, Prerequisite p
WHERE p.moduleNumber = m.moduleNumber
OR p.prerequisiteNumber = m.moduleNumber

SELECT m.moduleNumber as "Module", m.moduleName as "Module Title", p.moduleNumber as "Prerequisite"
FROM Module m
INNER JOIN Prerequisite s
ON m.moduleNumber = p.moduleNumber
INNER JOIN
(
     SELECT m.moduleName as "Prerequisite Title"
     FROM Module m, Prerequisite p
     WHERE m.moduleNumber = p.moduleNumber
)

这两者都没有为我提供我想要的结果。我觉得第一个比第二个更接近,但我似乎无法在其中任何一个方面取得进一步进展。我试过四处寻找,但我甚至不确定如何描述这个问题,更不用说从哪里开始寻求帮助了。

感谢您的时间。

修改

以下是模块和先决条件表的示例数据:

模块

moduleNumber | moduleName
C1930        | Computing
C1100        | Basic Computing
C1500        | Intermediate Computing
T1350        | Textiles
T1100        | Sewing

前提条件

moduleNumber | prerequisiteNumber
C1930        | C1100
C1930        | C1500
T1350        | T1100

1 个答案:

答案 0 :(得分:1)

如果您的先决条件在Module表中,那么您可能正在寻找的是:

SELECT m.moduleNumber as "Module", 
       m.moduleName as "Module Title", 
       p.moduleNumber as "Prerequisite", 
       p.moduleName as "Prerequisite Title"
FROM Module m, Module p, Prerequisite mp
WHERE m.moduleNumber = pm.moduleNumber and p.moduleNumber = pm.prerequisiteNumber

使用旧的SQL或:

SELECT m.moduleNumber as "Module", 
       m.moduleName as "Module Title", 
       p.moduleNumber as "Prerequisite", 
       p.moduleName as "Prerequisite Title"
FROM Module m JOIN
     Prerequisite mp ON m.moduleNumber = mp.moduleNumber JOIN
     Module p ON p.moduleNumber = mp.prerequisiteNumber

使用ANSI SQL。