【问题标题】:SQl 3 table comparisonSQL 3 表比较
【发布时间】:2016-11-23 12:19:40
【问题描述】:

我完全是 access 和 sql 的初学者,也是这个伟大社区的新成员。 现在除了免责声明之外,我需要一些关于以下场景的帮助:)

我目前有 3 张桌子

1) Performance score(包含文件编号、名称和分数,一行 每个员工)

2) Strengths(文件编号、姓名和优势,每个员工的行数 取决于优势的数量)

3) Development Needs(文件号和需求,每个员工多行 取决于需要的数量)

问题是,当strengthsneeds 多时,反之亦然,信息较少的列具有重复值,以根据此screenshot 补偿行数。

有没有办法根据文件编号防止优势和需求列重复,以便该人具有 1 个优势和两个需求,反之亦然。

提前感谢:)

【问题讨论】:

  • 请编辑您的问题并添加您当前查询的 SQL。

标签: sql ms-access join duplicates


【解决方案1】:

正如@Tedo G. 所说 - 没有重复项,因为您在“需要”字段中有两个不同的值。

他给了你 SQL Server 解决方案,Access 解决方案需要一些 VBA。
您需要更新代码中的 SQL,以便它返回特定员工编号(或您的主键是什么)的所有需求。

Public Function JoinNeeds(EmployeeNumber As String) As Variant

    Dim qdf As DAO.QueryDef
'    Dim prm As DAO.Parameter
    Dim rst As DAO.Recordset
    Dim ReturnValue As String

    Set qdf = CurrentDb.CreateQueryDef("", "SELECT Need FROM Table3 WHERE [Employee Number]='" & EmployeeNumber & "'")

    'If you get a "too few parameters" error - uncomment these lines and try again.
'    For Each prm In qdf.Parameters
'        prm.Value = Eval(prm.Name)
'    Next prm
    Set rst = qdf.OpenRecordset

    With rst
        If Not .BOF And Not .EOF Then
            .MoveFirst
            Do While Not .EOF
                ReturnValue = ReturnValue & .Fields("Need") & "/"
                .MoveNext
            Loop
            JoinNeeds = Mid(ReturnValue, 1, Len(ReturnValue) - 1)
        Else
            JoinNeeds = Null
        End If
    End With

    rst.Close
    Set rst = Nothing
    Set qdf = Nothing

End Function

然后您可以在查询中使用该函数将需求连接在一起:

SELECT DISTINCT [Employee Number], JoinNeeds([Employee Number]) AS Need
FROM Table3;

注意:这可能会使您的查询速度变慢,具体取决于表的大小 - 它必须为每个员工执行代码。

【讨论】:

    【解决方案2】:

    没有重复,因为您在“需要”字段中有两个不同的值。

    但是你可以为每个独特的员工连接“需要”值,你会得到类似的东西

    《谈判技巧与演讲技巧》

    在一个“需要”行中。

    此时,我认为您不能在 MS Access Query 中执行此操作,因为每个唯一员工可能有无限数量的“需要”行。如果有的话,您需要使用 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,非常感谢,我会试一试,让您知道,
    猜你喜欢
    • 1970-01-01
    • 2014-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多