SQl 3表比较

SQl 3表比较,sql,ms-access,join,duplicates,Sql,Ms Access,Join,Duplicates,我是access&sql的初学者,也是这个伟大社区的新成员。 现在撇开这个免责声明不谈,我需要一些关于以下场景的帮助:) 我现在有3张桌子 1) 性能分数(包含文件编号、名称和分数,一行 (每位员工) 2) 优势(文件编号、姓名和优势、每位员工的多行 (取决于强度的数量) 3) 开发需求(文件编号和需求,每位员工多行) (取决于需求数量) 问题是,当强度大于需要时,或者反之亦然,信息较少的列具有重复值,以补偿根据此项设置的行数 是否有一种方法可以防止基于文件编号的“优势和需求”列重复,从而使该人

我是access&sql的初学者,也是这个伟大社区的新成员。 现在撇开这个免责声明不谈,我需要一些关于以下场景的帮助:)

我现在有3张桌子

1)
性能分数
(包含文件编号、名称和分数,一行 (每位员工)

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;