Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法减少SQL查询中的冗余字段?_Sql_Sql Server_Database - Fatal编程技术网

有没有办法减少SQL查询中的冗余字段?

有没有办法减少SQL查询中的冗余字段?,sql,sql-server,database,Sql,Sql Server,Database,我刚刚进入SQLServer,我已经构建了以下测试数据库 DB有4个实体:MC(就业地点)、用户、类和完成类。目的是跟踪为其各自MC(市场中心)参加培训课程的员工。我最近决定添加completed classes表来帮助规范化DB。这是我到目前为止的代码 " 查询提供了我想要的所有信息,但是冗余太多。本质上,我想显示学生参加了哪个课程。显然,学生参加了多个课程,但我不需要它告诉我每个已完成课程实例的学生姓名 我希望它看起来像这样: 学生:约翰·多伊,东MC,1、3、4、5班 而不是: 学生:约翰

我刚刚进入SQLServer,我已经构建了以下测试数据库

DB有4个实体:MC(就业地点)、用户、类和完成类。目的是跟踪为其各自MC(市场中心)参加培训课程的员工。我最近决定添加completed classes表来帮助规范化DB。这是我到目前为止的代码

"

查询提供了我想要的所有信息,但是冗余太多。本质上,我想显示学生参加了哪个课程。显然,学生参加了多个课程,但我不需要它告诉我每个已完成课程实例的学生姓名

我希望它看起来像这样:

学生:约翰·多伊,东MC,1、3、4、5班

而不是:

学生:约翰·多伊,东MC,1班

学生:约翰·多伊,东MC,3班

学生:约翰·多伊,东MC,4班

学生:约翰·多伊,东MC,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来表示表用户。您只能使用用户,而不能使用别名。如果查询给出了所需的答案,请将其标记为答案。谢谢