SQl 3表比较
我是access&sql的初学者,也是这个伟大社区的新成员。 现在撇开这个免责声明不谈,我需要一些关于以下场景的帮助:) 我现在有3张桌子 1)SQl 3表比较,sql,ms-access,join,duplicates,Sql,Ms Access,Join,Duplicates,我是access&sql的初学者,也是这个伟大社区的新成员。 现在撇开这个免责声明不谈,我需要一些关于以下场景的帮助:) 我现在有3张桌子 1) 性能分数(包含文件编号、名称和分数,一行 (每位员工) 2) 优势(文件编号、姓名和优势、每位员工的多行 (取决于强度的数量) 3) 开发需求(文件编号和需求,每位员工多行) (取决于需求数量) 问题是,当强度大于需要时,或者反之亦然,信息较少的列具有重复值,以补偿根据此项设置的行数 是否有一种方法可以防止基于文件编号的“优势和需求”列重复,从而使该人
性能分数
(包含文件编号、名称和分数,一行
(每位员工)
2) 优势
(文件编号、姓名和优势、每位员工的多行
(取决于强度的数量)
3) 开发需求
(文件编号和需求,每位员工多行)
(取决于需求数量)
问题是,当强度
大于需要时,或者反之亦然,信息较少的列具有重复值,以补偿根据此项设置的行数
是否有一种方法可以防止基于文件编号的“优势和需求”列重复,从而使该人员有一个优势和两个需求,反之亦然
提前感谢:)没有重复项,因为“需要”字段中有两个不同的值
但是,您可以将每个独特员工的“需要”值串联起来,您将得到如下结果
“谈判技巧和表达技巧”
在一个“需要”行中
在这一点上,我认为您不能在MS Access查询中这样做,因为每个唯一员工可能有无限数量的“需要”行。您需要使用VBA或SQL Server(如果有的话)。
SQL Server函数应如下所示:
DECLARE @MyCursor CURSOR;
DECLARE @EmployeeID INT;
DECLARE @cnt AS INT = 1
DECLARE @Res AS VARCHAR(4000) = ''
DECLARE @Res2 AS VARCHAR(4000) = ''
CREATE TABLE [ResultNeeds](Employeeid INT, Needs Varchar(Max))
BEGIN
SET @MyCursor = CURSOR FOR
SELECT [EmployeeID] FROM [Employees]
OPEN @MyCursor
FETCH NEXT FROM @MyCursor
INTO @EmployeeID
WHILE @@FETCH_STATUS = 0
BEGIN
IF OBJECT_ID('tempdb..#tmpNeeds') IS NOT NULL DROP TABLE #tmpNeeds
SELECT * INTO #tmpNeeds FROM [Needs] WHERE [EmployeeID] = @EmployeeID
WHILE @cnt > 0
BEGIN
SELECT
TOP 1 @Res = [NeedName]
FROM
#tmpNeeds
SELECT @Res2 = @Res2 + @Res + '; '
DELETE FROM #tmpNeeds WHERE [NeedName] = @Res
INSERT INTO [ResultNeeds] VALUES @EmployeeID, @Res2
SELECT @cnt = ISNULL(COUNT(*), 0)
FROM
#tmpNeeds
END
FETCH NEXT FROM @MyCursor
INTO @EmployeeID
END;
CLOSE @MyCursor ;
DEALLOCATE @MyCursor;
END;
注意:这是示例逻辑,我没有像@Tedo G所说的那样测试真实数据。没有重复项,因为“需要”字段中有两个不同的值
他为您提供了SQL Server解决方案,Access解决方案需要一些VBA。
您需要更新代码中的SQL,以便它返回特定员工编号(或主键是什么)的所有需求
然后,您可以使用查询中的函数将需求连接在一起:
SELECT DISTINCT [Employee Number], JoinNeeds([Employee Number]) AS Need
FROM Table3;
注意:这可能会降低查询速度,这取决于表的大小-它必须为每个员工执行代码。请编辑您的问题并添加当前查询的SQL。谢谢Tedo,非常感谢我会尝试一下并让您知道,
SELECT DISTINCT [Employee Number], JoinNeeds([Employee Number]) AS Need
FROM Table3;