有没有办法减少SQL查询中的冗余字段?
我刚刚进入SQLServer,我已经构建了以下测试数据库 DB有4个实体:MC(就业地点)、用户、类和完成类。目的是跟踪为其各自MC(市场中心)参加培训课程的员工。我最近决定添加completed classes表来帮助规范化DB。这是我到目前为止的代码 " 查询提供了我想要的所有信息,但是冗余太多。本质上,我想显示学生参加了哪个课程。显然,学生参加了多个课程,但我不需要它告诉我每个已完成课程实例的学生姓名 我希望它看起来像这样: 学生:约翰·多伊,东MC,1、3、4、5班 而不是: 学生:约翰·多伊,东MC,1班 学生:约翰·多伊,东MC,3班 学生:约翰·多伊,东MC,4班 学生:约翰·多伊,东MC,5班有没有办法减少SQL查询中的冗余字段?,sql,sql-server,database,Sql,Sql Server,Database,我刚刚进入SQLServer,我已经构建了以下测试数据库 DB有4个实体:MC(就业地点)、用户、类和完成类。目的是跟踪为其各自MC(市场中心)参加培训课程的员工。我最近决定添加completed classes表来帮助规范化DB。这是我到目前为止的代码 " 查询提供了我想要的所有信息,但是冗余太多。本质上,我想显示学生参加了哪个课程。显然,学生参加了多个课程,但我不需要它告诉我每个已完成课程实例的学生姓名 我希望它看起来像这样: 学生:约翰·多伊,东MC,1、3、4、5班 而不是: 学生:约翰
我希望这是有意义的。在MS Sql Server中是否有这样的显示方式?我对所有这些都还很陌生,因此提前感谢您的帮助。让我们为不同的类/用户/完成添加一些示例数据(为了简单起见,我忽略了mark center) 那么您可以使用这个查询
SELECT urs2.u_FirstName,
urs2.u_LastName,
(STUFF((SELECT CAST(', ' + cls.class_name AS varchar(MAX))
FROM classes cls INNER JOIN completed comp on cls.class_id = comp.complete_class_id
INNER JOIN users urs ON comp.complete_user_id = urs.users_id
where comp.complete_class_id is not null and urs.users_id = urs2.users_id
for XML PATH('')), 1, 1, '')) AS Classes
from users urs2
输出是这样的
u_Firstname u_LastName Classes
cd ab AA, BB
gh ef NULL
SELECT urs2.u_FirstName,
urs2.u_LastName,
(STUFF((SELECT CAST(concat(', ' , cls.class_id) AS varchar(MAX))
FROM classes cls INNER JOIN completed comp on cls.class_id = comp.complete_class_id
INNER JOIN users urs ON comp.complete_user_id = urs.users_id
where comp.complete_class_id is not null and urs.users_id = urs2.users_id
for XML PATH('')), 1, 1, '')) AS Classes
from users urs2
请注意,如果您想使用类id而不是类名,那么您需要像这样使用concat
函数
u_Firstname u_LastName Classes
cd ab AA, BB
gh ef NULL
SELECT urs2.u_FirstName,
urs2.u_LastName,
(STUFF((SELECT CAST(concat(', ' , cls.class_id) AS varchar(MAX))
FROM classes cls INNER JOIN completed comp on cls.class_id = comp.complete_class_id
INNER JOIN users urs ON comp.complete_user_id = urs.users_id
where comp.complete_class_id is not null and urs.users_id = urs2.users_id
for XML PATH('')), 1, 1, '')) AS Classes
from users urs2
请参阅旁注:由于您是SQL新手,请尽量不要使用隐式
JOIN
,我会听取您的建议。我仍然不了解连接之间的区别,但我目前正处于SQL之旅的这一阶段。谢谢您的建议!谢谢您的所有建议。我将接受所有这些建议,看看是否能得到我想要的结果。我会检查k回来了,谢谢!不过我有一个问题。我希望你能回答这个问题,或者至少给我指出正确的方向,这样我就可以在自己的时间里理解这个问题。你从哪里得到的“usrs2”和“cls”以及“comp”。"? 有没有一个特定的SQL主题可以更好地解释这些问题?对不起,我才干了两个星期。LOL.@Big_dog_,这些在sql server中被称为别名。这些是您拥有的表,每个表都有一个可选名称。因此,当我说users urs时,我使用别名urs来表示表用户。您只能使用用户,而不能使用别名。如果查询给出了所需的答案,请将其标记为答案。谢谢