防止SQL查询,ASP.net重复

时间:2015-10-30 02:29:22

标签: c# sql asp.net

我使用Visual Studio中的查询生成器进行以下SQL查询。正如您所看到的那样,同一个用户被重复了3次,这是因为用户有3种不同的技能。如何在SQL查询或ListView控件中将3种技能合并在一起,以便它只显示一个结果而不是3,并且用户列出了3种技能?

SELECT users.role_id, users.username, users.first_name, users.last_name, users.description, roles.role_id, roles.role, skills.skill_id, skills.user_id, skills.skill 
FROM users 
INNER JOIN roles ON users.role_id = roles.role_id 
INNER JOIN skills ON users.user_id = skills.user_id 
WHERE (users.role_id = 3)

SQL Query Builder Results

3 个答案:

答案 0 :(得分:1)

尝试使用StuffFor Xml

这是小提琴:

http://sqlfiddle.com/#!6/fcf71/5

看看它是否有用,它只是一个示例,因此您必须更改列名称。

答案 1 :(得分:1)

使用For XML Path(''), Type。这有点像黑客,因为你真的在没有root的情况下创建一个XML字符串并且形成了奇怪的元素,但是效果很好。请务必包含Type位,否则XML技巧会尝试将特殊字符(如<&)转换为XML转义序列(here就是一个示例)

Here是SQL小提琴中问题的简化版本。以下是相关的Select代码段。

SELECT users.user_id, users.first_name, 
STUFF(
  (SELECT  ', ' + skill
        FROM skills
        WHERE users.user_id = skills.user_id 
        FOR XML PATH(''), TYPE
         ).value('.', 'VARCHAR(MAX)')
  , 1, 2, '') AS skill_list
FROM users

答案 2 :(得分:0)

您可以在技能上使用PIVOT,然后将这些技能分组到一列中。 为简单起见,我使用以下一些示例数据对其进行测试:

CREATE SCHEMA _Test

CREATE TABLE _Test.SkillSet(SkillId INT IDENTITY(1,1) PRIMARY KEY, SkillName NVARCHAR(64))
INSERT INTO _Test.SkillSet(SkillName) VALUES('C/C++')
INSERT INTO _Test.SkillSet(SkillName) VALUES('C#')
INSERT INTO _Test.SkillSet(SkillName) VALUES('Java')

CREATE TABLE _Test.Employees(EmpId INT IDENTITY(1,1) PRIMARY KEY, FullName NVARCHAR(256))

INSERT INTO _Test.Employees(FullName) VALUES('Philip Hatt')
INSERT INTO _Test.Employees(FullName) VALUES('John Rosh')

CREATE TABLE _Test.Employee_Skill(EmpId INT FOREIGN KEY REFERENCES _Test.Employees(EmpId), SkillId INT FOREIGN KEY REFERENCES _Test.SkillSet(SkillId))

INSERT INTO _Test.Employee_Skill(EmpId, SkillId) VALUES(1, 1)
INSERT INTO _Test.Employee_Skill(EmpId, SkillId) VALUES(1, 2)
INSERT INTO _Test.Employee_Skill(EmpId, SkillId) VALUES(1, 3)

INSERT INTO _Test.Employee_Skill(EmpId, SkillId) VALUES(2, 2)
INSERT INTO _Test.Employee_Skill(EmpId, SkillId) VALUES(2, 3)

WITH tEmpSkill
AS
(SELECT A.EmpId, A.FullName, C.SkillName
FROM _Test.SkillSet C RIGHT JOIN
(
    _Test.Employees A LEFT JOIN _Test.Employee_Skill B
    ON A.EmpId = B.EmpId
)
ON B.SkillId = C.SkillId
)
SELECT * FROM tEmpSkill
PIVOT(COUNT(SkillName) FOR SkillName IN([C/C++], [C#], [Java])) AS Competency

上面的查询给出了一个中间结果 PIVOT RESULT

现在,您可以轻松制作包含每位员工所需技能的字符串。您还可以搜索一些文章以使用具有未知列数(技能组)的PIVOT,这可能更好地满足您的需求。 希望这可以提供帮助。