我想加入三张桌子。
加入表格有两个条件,[项目编号]和[当前月份] - 日期字段。通过指定月份和年份以及项目编号,我想获得结果。
我使用了这段代码但是当它到达第二个连接语句时,它会在查询表达式''中引发错误 - >语法错误(缺少运算符)。
我省略了第二个连接语句来测试第一个连接,但我得到的结果是实际记录的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
答案 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,您的参数也会更强类型化,从而减少转换错误或截断,例如添加日期参数将向服务器发送日期,日期是日期,不能被区域设置误解,而如果您将日期作为连接字符串传递,除非您使用文化不变日期设置,否则有可能收到转换错误。