【问题标题】:SQl 3 table comparisonSQL 3 表比较
【发布时间】:2016-11-23 12:19:40
【问题描述】:
我完全是 access 和 sql 的初学者,也是这个伟大社区的新成员。
现在除了免责声明之外,我需要一些关于以下场景的帮助:)
我目前有 3 张桌子
1) Performance score(包含文件编号、名称和分数,一行
每个员工)
2) Strengths(文件编号、姓名和优势,每个员工的行数
取决于优势的数量)
3) Development Needs(文件号和需求,每个员工多行
取决于需要的数量)
问题是,当strengths 比needs 多时,反之亦然,信息较少的列具有重复值,以根据此screenshot 补偿行数。
有没有办法根据文件编号防止优势和需求列重复,以便该人具有 1 个优势和两个需求,反之亦然。
提前感谢:)
【问题讨论】:
标签:
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;
注意:这是示例逻辑,我没有测试过真实数据