我刚刚进入SQL服务器,我已经构建了以下测试数据库。
数据库有4个实体:MC(雇佣地点),用户,类和已完成的类。目的是跟踪为各自的MC(市场中心)提供培训课程的员工。我决定最近在已完成的类表上添加以帮助规范化DB。这是我到目前为止的代码。
“
--CREATE CLASS TABLE BELOW
CREATE TABLE classes
(class_id INT CONSTRAINT class_class_id_pk PRIMARY KEY,
class_name VARCHAR (30) CONSTRAINT class_class_name_nn NOT NULL,
class_address VARCHAR (40),
class_city VARCHAR (20),
class_state VARCHAR (30),
class_instructor VARCHAR (25));
--CREATE USER TABLE BELOW
CREATE TABLE users
(users_id INT CONSTRAINT users_users_id_pk PRIMARY KEY,
u_username VARCHAR (30) CONSTRAINT users_u_username_nn NOT NULL,
u_LastName VARCHAR (30),
u_FirstName VARCHAR (25),
u_password VARCHAR (20),
u_authentication CHAR (1));
--CREATE COMPLETED CLASS TABLE BELOW
CREATE TABLE completed
(complete_id INT CONSTRAINT completed_complete_id_pk PRIMARY KEY,
complete_class_id INT CONSTRAINT completed_complete_class_id_fk FOREIGN KEY (complete_class_id)
REFERENCES classes (class_id) ,
complete_user_id INT CONSTRAINT completed_complete_user_id_fk FOREIGN KEY (complete_user_id)
REFERENCES users (users_id));
--CREATE MARKET CENTER TABLE BELOW
CREATE TABLE marketcenter
(mc_id INT CONSTRAINT marketcenter_mc_id_pk PRIMARY KEY,
mc_name VARCHAR (40) CONSTRAINT marketcenter_mc_name_nn NOT NULL,
mc_poc VARCHAR (30));
--ALTER STATEMENT / FOREIGN KEY IMPLEMENTATION
ALTER TABLE users
ADD u_class_id INT;
ALTER TABLE users
ADD u_mc_id INT;
ALTER TABLE users
ADD CONSTRAINT users_u_class_id_fk FOREIGN KEY (u_class_id)
REFERENCES classes (class_id);
ALTER TABLE users
ADD CONSTRAINT users_u_mc_id_fk FOREIGN KEY (u_mc_id)
REFERENCES marketcenter (mc_id);
"
Never mind the specifics, the tables were built up just fine (i think). My problem is when I run a query. For example:
SELECT u_FirstName, u_LastName, mc_name, class_name
FROM users, marketcenter, completed, classes
WHERE complete_class_id = class_id
AND u_mc_id = mc_id
AND complete_user_id = users_id
ORDER BY mc_name;
查询为我提供了我想要的所有信息,但冗余太多了。基本上我想展示学生上哪节课。很明显,学生已经上了不止一个课程,但是我不需要它来告诉我学生完成课程每个实例的名称。
我希望它看起来像这样:
学生:John Doe,East MC,1级,3级,4级,5级
代替:
学生:John Doe,East MC,Classes 1
学生:John Doe,East MC,Classes 3
学生:John Doe,East MC,Classes 4
学生:John Doe,East MC,5级
我希望这是有道理的。在MS Sql Server中有没有办法像这样显示它?我仍然很新,所以感谢提前的帮助。
答案 0 :(得分:0)
让我们为不同的类/用户/已完成添加一些示例数据(为简单起见,我忽略了标记中心)。
INSERT INTO Classes VALUES
(1, 'AA', 'AAAA', 'AAAA','AAAA','AAAAA'),
(2, 'BB', 'BBBB', 'BBBB','BBBB','BBBB')
INSERT INTO users (USERS_ID,U_USERNAME, u_LastName, u_FirstName) VALUES
(11,'abc', 'ab', 'cd'),
(22, 'efg','ef','gh')
INSERT INTO Completed VALUES
(1, 1, 11),
(2, 2, 11)
然后你可以使用这个查询
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
请注意,如果您想使用类ID而不是类名,那么您需要使用concat
这样的函数
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