如何停止1:*关系输出比源表中更多的记录(MS Access SQL)

时间:2014-07-31 03:28:19

标签: sql ms-access duplicates foreign-key-relationship

我的数据库是一个时间&计费数据库,记录各种用户在各种项目上花费的时间。用户可以“小时”产生许多时间记录,项目可以分配许多“小时”。

我将这些小时从excel导入临时表,没有主键,然后进入:

  
      
  1. 项目表(一个查询只获取项目名称并生成一个新项目,如果不存在 - 运作良好)
  2.   
  3. 用户表 - (相同,左连接如果不匹配则生成新用户)
  4.   
  5. 小时表(给定项目的许多用户/描述组合)
  6.   
## ImportData ##
Project | User | Description
ABC Inc | RMA  | Looked at stuff
ABC Inc | JRQ  | Found something
LOL Inc | JRQ  | Looked at stuff

## Users ##
ID | Name
 1 | RMA
 2 | JRQ

## Projects ##
ID | Name    | Client
 1 | ABC Inc | 1 (McDonalds)
 2 | ABC Inc | 2 (Wendys)
 2 | LOL Inc | 1 (McDonalds)

我想使用正确的外键将ImportData小时数插入到Hours表中,但我使用以下代码获取重复项:

SELECT Users.ID, Projects.ID, ImportData.*
FROM (ImportData LEFT JOIN Employees ON ImportData.User = Users.Name) 
    LEFT JOIN Projects ON ImportData.Project = Projects.Name;

如何强制SQL只添加与THAT PARTICULAR ROW的用户/项目相关的外键,而不添加更多匹配项?

我发现大量的重复项源自具有不同客户端的相同项目名称。也许我需要嵌套另一个查询?

3 个答案:

答案 0 :(得分:1)

你自己说:

  

具有不同客户的相同项目名称。

暂时忘记您正在尝试构建查询:只需查看数据,看看是否可以猜测给定ProjectID的{​​{1}}应该是多少项目同名?
我当然无法猜测要返回什么。

您无法忽略此问题:在您找到将正确的Projects.Name与给定的Projects.ID相关联的规则之前,您的问题无法解决。

我的猜测是,ImportData字段中还有其他内容可以帮助您将正确的项目分配给给定的ImportData记录。
您如何知道给定ImportData记录的客户端是哪个?

如果你不得不手动进行匹配,你会怎么做? 首先解决这个问题,然后解决方案可能会变得明显。

答案 1 :(得分:0)

LEFT JOIN引入了NULL,其中没有找到匹配项。使用(内部)加入。此外,您无需嵌套连接。

答案 2 :(得分:0)

对于那些发现这个问题的人来说,答案是第三层Select查询基于我的查询,我怀疑它删除了多个客户端的一个项目名称的场景。

  
      
  1. Projects Extended - 整理项目的详细信息 - 所有者,客户
  2.   
  3. ImportData Extended - 在Projects Extended[Project Name]
  4. 上加入[Client Name]   
  5. 实际导入查询 - 执行我原本想要的追加。
  6.   

感谢那些有帮助的人,他们可以看到我不能