可能不是最具描述性的标题,但有时候很难将愚蠢的SQL问题(这种问题让你想要将咖啡加入咖啡中度过这一天)变成英语。我基本上有以下两个表:
TABLE1
studentid firstname lastname counter cmid score lessond
328000 Jacob GG 5 189 90 103950
328111 Jacob GG 6 189 80 103951
3283333 Tyler GR 5 189 70 103950
3244444 William FL 5 189 70 103950
3280000 Sean DA 5 189 80 103950
3283333 Sean DA 6 189 90 103951
表2
Lesson2ClassroomAssignmentId Counter
103956 1
103947 2
103948 3
103949 4
103950 5
103951 6
第一张表基本上是学生名单及其某些课程的分数(编号为1-6,由计数器表示)。第二个表是所有可能课程的列表(编号为1-6并由计数器表示)。
我需要做的是获得一个表格,每个学生和每节课都有一行,无论学生是否在表1中有一行用于该课程。
我尝试过做一些事情,比如从表1中选择*并使用第一个表LEFT OUTER JOINED与第一个表的结果进行联合,其中第一个表是<>反击,但没有能够得到我想要的结果。
如果有人有任何建议(不需要完整的答案,只是指向正确的方向)我应该欠你一个!或者,如果这篇文章不可理解,请随意取笑我,因为它对我来说几乎没有意义,我是那个在过去6个小时里一直盯着它的人;)
Ciao Ciao,添
期望的输出:
所需的输出将是:
TABLE FINAL
studentid firstname lastname counter cmid score lessond
3280000 Jacob GG 1 NULL, NULL, NULL
3280000 Jacob GG 2 NULL, NULL, NULL
3280000 Jacob GG 3 NULL, NULL, NULL
3280000 Jacob GG 4 NULL, NULL, NULL
3280000 Jacob GG 5 189, 90, 103950
3280000 Jacob GG 6 189, 80, 103951
3283333 Tyler GR 1, NULL, NULL, NULL
3283333 Tyler GR 2, NULL, NULL, NULL
3283333 Tyler GR 3, NULL, NULL, NULL
3283333 Tyler GR 4, NULL, NULL, NULL
3283333 Tyler GR 5, 189, 70, 103950
3283333 Tyler GR 6, NULL, NULL, NULL
因此,基本上从第一表中为学生提供实际课程数据的任意行,并使用虚拟行补充它,每个课程(表2)没有得分数据,该学生没有得分。
答案 0 :(得分:2)
尝试使用交叉连接
e.g: 我添加了一个伪列IsMatch来识别当前行是否是匹配的行,以防万一......
SELECT a.*,
b.*,
a.counter-b.counter AS IsMatch
FROM TABLE1 a CROSS JOIN TABLE2 b
ORDER BY studentid
答案 1 :(得分:0)
看起来您可以从Student表和Lesson表中受益。 然后你可以从他们那里做一个未加入的选择,以获得所有行的交叉产品。
答案 2 :(得分:-1)
如果您觉得有价值的时间只需购买一种旨在提供此类功能的商业产品。
我对EMS Data Generator for SQL Server非常满意,价格低于100美元......
用于SQL Server的EMS数据生成器是 一个令人印象深刻的产生测试 数据到SQL Server数据库表 有可能保存和编辑 脚本。该实用程序可以帮助您 模拟数据库生产 环境,并允许您填充 几个SQL Server数据库表 同时测试数据,定义 用于生成数据的表和字段, 设置值范围,生成SQL Server 掩码中的char字段,定义列表 手动值或从中选择它们 SQL查询,设置生成参数 对于每种字段类型,还有许多其他类型 用于生成SQL Server测试的功能 数据以简单直接的方式。数据 Generator for SQL Server也提供 控制台应用程序,允许 您要生成SQL Server测试数据 通过使用一代一触即发 模板。