使用月和年标准加入3个表

时间:2014-05-20 09:53:39

标签: sql

我想加入三张桌子。

加入表格有两个条件,[项目编号]和[当前月份] - 日期字段。通过指定月份和年份以及项目编号,我想获得结果。

我使用了这段代码但是当它到达第二个连接语句时,它会在查询表达式''中引发错误 - >语法错误(缺少运算符)。

我省略了第二个连接语句来测试第一个连接,但我得到的结果是实际记录的4倍。如果我在每个表中有4条记录要加入,我得到64条记录。

对我的代码进行任何修改都会非常感激。我也在使用临时表。

     INSERT INTO patempTable 
               SELECT 
                      pr.[project number], 
                      pr.[employee number], 
                      pr.[current month], 
                      pr.[net pay], 
                      al.[net allowance], 
                      pd.[net] 
               FROM 
                      [pay_roll] pr 
               INNER JOIN [allowance] al ON pr.[project number] = al.[project number]
                     AND MONTH(pr.[current month])=MONTH(al.[current month]) 
                     AND YEAR(pr.[current month])=YEAR(al.[current month]) 
               JOIN [per_diem_accomodation] pd ON pr.[project number]=pd.[project number] 
                    AND MONTH(pr.[current month])= MONTH(pd.[current month])
                    AND YEAR(pr.[current month])=YEAR(pd.[current month]) 
               WHERE 
                    pr.[project number]='" & projcode & "' AND 
                    MONTH(pr.[current month])=" & monthnumber & " AND  
                    YEAR(pr.[current month])=" & period 

1 个答案:

答案 0 :(得分:0)

听起来项目编号和当前月份在您的表格中并不是唯一的,因此您将获得笛卡尔积。想象一下这个简单的例子:

Table1                  Table2

+------+------+         +------+------+
| Col1 | Col2 |         | Col1 | Col2 |
+------+------+         +------+------+
|  A   |  1   |         |  A   |  3   |
|  A   |  2   |         |  A   |  4   |
+------+------+         +------+------+

然后运行此查询:

SELECT  t1.Col1, t1.Col2, t1.Col3
FROM    Table1 AS t1
        INNER JOIN Table2 AS t2
            ON t1.Col1 = t2.Col1;

你最终会得到:

+------+------+------+
| Col1 | Col2 | Col2 |
+------+------+------+
|  A   |  1   |  3   |
|  A   |  2   |  3   |
|  A   |  1   |  4   |
|  A   |  2   |  4   |
+------+------+------+

即。您可以从两个表中获得每个可能的行组合,从而使第一个表中的行数加倍。您需要在子查询中汇总表格,即

SELECT  t1.Col1, t1.Col2, t1.Col3
FROM    (   SELECT  Col1, SUM(Col2) AS Col2
            FROM    Table1 
            GROUP BY Col1 
        ) AS t1
        INNER JOIN
        (   SELECT  Col1, SUM(Col2) AS Col2
            FROM    Table2 
            GROUP BY Col1 
        ) AS t2
            ON t1.Col1 = t2.Col1;

+------+------+------+
| Col1 | Col2 | Col2 |
+------+------+------+
|  A   |  3   |  7   |
+------+------+------+

或者你需要扩展你的连接标准,使其至少达到1-n关系,而不是n-n。

我不知道您的数据是什么,或者您的预期结果是什么,所以我无法进一步提出建议。

关于 USE PARAMETERIZED QUERIES 的无关,但非常重要提示。 SQL Injection是将变量连接到SQL的潜在风险,但这远远不是使用它的唯一原因。当您使用参数化查询时,您将能够使用缓存的查询计划,这意味着每次将SQL发送到服务器时都不必编译SQL,您的参数也会更强类型化,从而减少转换错误或截断,例如添加日期参数将向服务器发送日期,日期是日期,不能被区域设置误解,而如果您将日期作为连接字符串传递,除非您使用文化不变日期设置,否则有可能收到转换错误。