Sql 为什么我会得到重复的查询记录?

Sql 为什么我会得到重复的查询记录?,sql,ms-access,Sql,Ms Access,我有一个查询qry_prob,结果如下: +------+-------------+--------------+ | PK_G | ID1_Prob_Ov | ID1_Prob_Sur | +------+-------------+--------------+ | 1044 | 47.17% | 72.17% | | 1045 | 46.93% | 53.79% | | 1046 | 49.57% | 50.66% | |

我有一个查询qry_prob,结果如下:

+------+-------------+--------------+
| PK_G | ID1_Prob_Ov | ID1_Prob_Sur |
+------+-------------+--------------+
| 1044 | 47.17%      | 72.17%       |
| 1045 | 46.93%      | 53.79%       |
| 1046 | 49.57%      | 50.66%       |
| 1047 | 59.89%      | 66.54%       |
+------+-------------+--------------+
由此,我想创建另一个查询,该查询采用“Prob”字段,并使用引用表tbl_bldpct为每条记录创建一个混合百分比,如下所示:

+----+------------+---------+
| ID | Bld_Input  | Bld_Pct |
+----+------------+---------+
|  1 | % Prob Ov  | 15.00%  |
|  2 | % Prob Sur | 85.00%  |
+----+------------+---------+
+------+--------------+
| PK_G | ID1_prob_bld |
+------+--------------+
| 1044 | 68.42%       |
| 1044 | 68.42%       |
| 1045 | 52.76%       |
| 1045 | 52.76%       |
| 1046 | 50.50%       |
| 1046 | 50.50%       |
| 1047 | 65.54%       |
| 1047 | 65.54%       |
+------+--------------+
结果应该如下所示:

+------+--------------+
| PK_G | ID1_prob_bld |
+------+--------------+
| 1044 | 68.42%       |
| 1045 | 52.76%       |
| 1046 | 50.50%       |
| 1047 | 65.54%       |
+------+--------------+
我使用了以下SQL:选择qry_prob.PK_G,[qry_prob].[ID1_prob_Ov]*从tbl_bldpct中选择Bld_Pct,其中ID=1+[qry_prob].[ID1_prob_Sur]*从tbl_bldpct中选择Bld_Pct,其中ID=2作为ID1_prob_Bld 来自qry_prob,tbl_bldpct

但是,我得到的重复行如下所示:

+----+------------+---------+
| ID | Bld_Input  | Bld_Pct |
+----+------------+---------+
|  1 | % Prob Ov  | 15.00%  |
|  2 | % Prob Sur | 85.00%  |
+----+------------+---------+
+------+--------------+
| PK_G | ID1_prob_bld |
+------+--------------+
| 1044 | 68.42%       |
| 1044 | 68.42%       |
| 1045 | 52.76%       |
| 1045 | 52.76%       |
| 1046 | 50.50%       |
| 1046 | 50.50%       |
| 1047 | 65.54%       |
| 1047 | 65.54%       |
+------+--------------+
如果我将另一行添加到我的引用表中,我会得到另一行重复项,这样我可以看到问题在于从该表中选择记录,但我不知道如何修复它…

尝试使用Distinct:

选择不同的 qry_prob.PK_G, [qry_prob].[ID1_prob_Ov]*从tbl_bldpct中选择Bld_Pct,其中ID=1+[qry_prob].[ID1_prob_Sur]*从tbl_bldpct中选择Bld_Pct,其中ID=2作为ID1_Bld 从…起 qry_prob, tbl_bldpct; 或者简单地移除表格:

选择 qry_prob.PK_G, [qry_prob]。[ID1_prob_Ov]*从tbl_bldpct中选择Bld_Pct,其中ID=1+ [qry\U prob]。[ID1\U prob\U Sur]*从tbl\U bldpct中选择Bld\U Pct,其中ID=2作为ID1\U prob\U Bld 从…起 qry_-prob;
这是因为您正在对两个表qry_prob、tbl_bldpct进行交叉联接。如果只在FROM子句中指定以逗号分隔的表,而不提及特定的联接条件,则会自动发生这种情况:

FROM qry_prob, tbl_bldpct
由于SELECTquery中不需要第二个表,因此您可以安全地忽略它并消除交叉连接,它将返回两个表记录的笛卡尔积

SELECT qry_prob.PK_G, 
   [qry_prob].[ID1_Prob_Ov]*(SELECT Bld_Pct FROM tbl_bldpct WHERE ID = 1)
   +[qry_prob].[ID1_Prob_Sur]*(SELECT Bld_Pct FROM tbl_bldpct WHERE ID = 2) AS ID1_prob_bld
FROM qry_prob
如果我没弄错的话

SELECT Table2.PK_G, [Bld_Input]*0.15+[ Bld_Pct]*0.85 AS ID1_prob_bld
FROM qry_prob;
基于Bld_Pct

您可以加入tbl_bldpct两次。不幸的是,MS Access的联接语法不是很灵活,因此您需要在WHERE子句中使用带筛选的交叉联接:

您还可以预聚合tbl_bldpct:


我没有注意到tbl_bldpct…我修改了我的答案…很简单
select (qp.ID1_Prob_oc * bp.Bld_Pct_1 + qp.ID1_Prob * bp.Bld_Pct2) as ID1_prob_bld
from qry_prob as qp, 
     (select max(iif(id = 1, Bld_Pct, null)) as Bld_Pct_1,
             max(iif(id = 1, Bld_Pct, null)) as Bld_Pct_2                 
      from tbl_bldpct
     ) bp;