我的数据库是一个时间&计费数据库,记录各种用户在各种项目上花费的时间。用户可以“小时”产生许多时间记录,项目可以分配许多“小时”。
我将这些小时从excel导入临时表,没有主键,然后进入:
- 项目表(一个查询只获取项目名称并生成一个新项目,如果不存在 - 运作良好)
- 用户表 - (相同,左连接如果不匹配则生成新用户)
- 小时表(给定项目的许多用户/描述组合)
醇>
## 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的用户/项目相关的外键,而不添加更多匹配项?
我发现大量的重复项源自具有不同客户端的相同项目名称。也许我需要嵌套另一个查询?
答案 0 :(得分:1)
你自己说:
具有不同客户的相同项目名称。
暂时忘记您正在尝试构建查询:只需查看数据,看看是否可以猜测给定ProjectID
的{{1}}应该是多少项目同名?
我当然无法猜测要返回什么。
您无法忽略此问题:在您找到将正确的Projects.Name
与给定的Projects.ID
相关联的规则之前,您的问题无法解决。
我的猜测是,ImportData
字段中还有其他内容可以帮助您将正确的项目分配给给定的ImportData
记录。
您如何知道给定ImportData
记录的客户端是哪个?
如果你不得不手动进行匹配,你会怎么做? 首先解决这个问题,然后解决方案可能会变得明显。
答案 1 :(得分:0)
LEFT JOIN引入了NULL,其中没有找到匹配项。使用(内部)加入。此外,您无需嵌套连接。
答案 2 :(得分:0)
对于那些发现这个问题的人来说,答案是第三层Select查询基于我的查询,我怀疑它删除了多个客户端的一个项目名称的场景。
Projects Extended
- 整理项目的详细信息 - 所有者,客户- ImportData Extended - 在
上加入Projects Extended
和[Project Name]
[Client Name]
- 实际导入查询 - 执行我原本想要的追加。
醇>
感谢那些有帮助的人,他们可以看到我不能