2014-01-17 40 views
1

尽管经历了我可能在互联网上找到的所有材料,但我自己也无法解决此问题。我是MS Access新手,非常感谢任何指针。 这里是我的问题 - 我有三个表加入三张表时,记录数不匹配

  1. Source1084与列 - 部门,分部门,实体帐户,+几
  2. R12CAOmappingTable与列 - 账户,R12_Account
  3. 表4的列 - R12_Account ,Department,Sub-Dept,Entity,New Dept,LOB + more

我在Source中共有1084条记录,结果表中也必须包含1084条记录。我需要从R12CAOmappingTable + Table4中的所有列中绘制Source + R12_account中所有列的表格。

这是我写的查询。这会产生正确的列,但通过交换不同的连接选项,可以为我提供更多或更少的记录数。

SELECT rmt.r12_account, 
     srb.version, 
     srb.fy, 
     srb.joblevel, 
     srb.scenario, 
     srb.department, 
     srb.[sub-department], 
     srb.[job function], 
     srb.entity, 
     srb.employee, 
     table4.lob, 
     table4.product, 
     table4.newacct, 
     table4.newdept, 
     srb.[beg balance], 
     srb.jan, 
     srb.feb, 
     srb.mar, 
     srb.apr, 
     srb.may, 
     srb.jun, 
     srb.jul, 
     srb.aug, 
     srb.sep, 
     srb.oct, 
     srb.nov, 
     srb.dec, 
     rmt.r12_account 
FROM (source1084 AS srb 
     LEFT JOIN r12caomappingtable AS rmt 
       ON srb.account = rmt.account) 
     LEFT JOIN table4 
       ON (srb.department = table4.dept) 
       AND (srb.[sub-department] = table4.subdept) 
       AND (srb.entity = table4.entity) 
WHERE (((srb.[sub-department]) = table4.subdept) 
     AND ((srb.entity) = table4.entity) 
     AND ((rmt.r12_account) = table4.r12_account)); 
+0

谢谢。但是你提到的查询返回没有值。如果我只在Where子句上方使用它,我会得到结果,但是对于Table4中的列没有返回值。 – Pri2304

回答

0

不知道你的表值很难给你的问题一个完整的答案。根据您如何描述问题导致您遇到问题。更可能基于您正在使用的连接类型。

我发现了解您应该使用哪种类型的连接的最佳方式是引用维恩图解释您可以使用的不同类型的连接。

enter image description here

杰夫阿特伍德也有SQL的一个很好的说明用上面的方法,以及对his site连接。

0

最好只使用查询生成器。放在你的主表中。选择你想要的列。现在,对于任何其他查找值,然后简单地放入其他表中,绘制连接线,双击并使用左连接。您可以为需要“抓取”或从其他表中查找其他值的2列或30列执行此操作。返回的基表中的ORIGINAL行的数量应始终保持不变。

所以,只需使用查询生成器,然后按照上面的说明。

你发布的SQL的问题是你嵌套在内部的连接()。不要这样做。 (或者让查询生成器为你做这件事 - 它们往往很杂乱,但也可以工作)。

只要使用此:

FROM source1084 AS srb 
LEFT JOIN r12caomappingtable AS rmt 
     ON srb.account = rmt.account 
LEFT JOIN table4 
      ON (srb.department = table4.dept) 
      AND (srb.[sub-department] = table4.subdept) 
      AND (srb.entity = table4.entity) 

如前所述,我不明白你为什么要在WHERE子句中再次“重复”的条件。

+0

Doesnot无效。也许'因为我在Access工作。不过谢谢。 – Pri2304

1

在这个简单的示例中,Table1包含3行,其中包含唯一的fld1值。 Table2包含一行,并且该行中的fld1值与Table1中的值匹配。因此这个查询返回3行。

SELECT * 
FROM 
    Table1 AS t1 
    LEFT JOIN Table2 AS t2 
    ON t1.fld1 = t2.fld1; 

但是如果我添加WHERE条款如下,查询该版本只返回一行---排在fld1值匹配。

SELECT * 
FROM 
    Table1 AS t1 
    LEFT JOIN Table2 AS t2 
    ON t1.fld1 = t2.fld1 
WHERE t1.fld1 = t2.fld1; 

换言之,即WHERE子句抵消LEFT JOIN,因为它排除行,其中t2.fld1为Null。如果有道理,请注意第二个查询在功能上与此相同...

SELECT * 
FROM 
    Table1 AS t1 
    INNER JOIN Table2 AS t2 
    ON t1.fld1 = t2.fld1; 

您的情况类似。我建议你先消除WHERE从句,并确认这个查询返回至少你预期的1084行。

SELECT Count(*) AS CountOfRows 
FROM (source1084 AS srb 
     LEFT JOIN r12caomappingtable AS rmt 
       ON srb.account = rmt.account) 
     LEFT JOIN table4 
       ON (srb.department = table4.dept) 
       AND (srb.[sub-department] = table4.subdept) 
       AND (srb.entity = table4.entity); 

后你得到的查询返回正确的行数,你可以改变SELECT列表返回你想要的列。但是,除非你能得到正确的行,否则列不是真正的问题。