我想写一个查询,列出我们大学提供的课程。一个程序至少包括一个主要的,可能包括一个“选项”,一个“专业”和一个“子专业”。这四个元素中的每个元素都有详细的代码,该代码将它们与专业相关。
一个专业可以有零个或多个选项,一个选项可以有零个或多个选项,而一个专业可以有零个或多个子选项。相反,允许专业没有与其相关的选择。
在结果集中,一行必须包含前一个元素才能具有下一个元素,即,一行将不包含major,no option和speciality。与专业相关的专业的出现意味着也存在与该专业相关的选项。
我的问题在于如何存储数据。所有程序数据都位于一张这样的表中:
+----------------+---------------+------+ | program_name | program_level | code | +----------------+---------------+------+ | Animal Science | Major | 1 | | Equine | Option | 1 | | Dairy | Option | 1 | | CLD | Major | 2 | | Thesis | Option | 2 | | Non-Thesis | Option | 2 | | Development | Specialty | 2 | | General | Subspecialty | 2 | | Rural | Subspecialty | 2 | | Education | Major | 3 | +----------------+---------------+------+
所需的输出将如下所示:
+----------------+-------------+----------------+-------------------+------+ | major_name | option_name | specialty_name | subspecialty_name | code | +----------------+-------------+----------------+-------------------+------+ | Animal Science | Equine | | | 1 | | Animal Science | Dairy | | | 1 | | CLD | Thesis | Development | General | 2 | | CLD | Thesis | Development | Rural | 2 | | CLD | Non-Thesis | Development | General | 2 | | CLD | Non-Thesis | Development | Rural | 2 | | Education | | | | 3 | +----------------+-------------+----------------+-------------------+------+
到目前为止,我已经尝试创建四个连接到此“代码”上的查询,每个查询均基于不同的“ program_level”进行选择。这些字段合并不正确。
我找不到比这更简单的方法:
/* Replace @Programs with the name of your table */ SELECT majors.program_name, options.program_name, specs.program_name, subspecs.program_name, majors.code FROM @Programs majors LEFT JOIN @Programs options ON majors.code = options.code AND options.program_level = 'Option' LEFT JOIN @Programs specs ON options.code = specs.code AND specs.program_level = 'Specialty' LEFT JOIN @Programs subspecs ON specs.code = subspecs.code AND subspecs.program_level = 'Subspecialty' WHERE majors.program_level = 'Major'
编辑:纠正错字“ Speciality”,它现在应该可以使用。