2012-01-12 110 views
0

我不确定为什么这样表现。我需要根据一些标准从两个表中选择几个值,这些标准应该从我在下面尝试的查询中清楚。从两个表中选择给出比预期更多的行

query = @"SELECT n.borrower, a.sum, n.lender FROM Notification AS n, Acknowledgment AS a 
      WHERE [email protected] AND n.id IN (SELECT parent_id FROM Acknowledgment 
              WHERE [email protected] AND [email protected])"; 

这会返回比预期更多的行(12)。

我有两个表的通知和确认都有字段“总和”。当我尝试下面的查询时,按照预期给出正确的3行。

@"SELECT n.borrower, n.sum, n.lender FROM Notification AS n 
    WHERE [email protected] AND n.id IN (SELECT parent_id FROM Acknowledgment 
            WHERE [email protected] AND [email protected])"; 

现在我需要让我需要a.sum而不是n.sum扩展这个查询。但是当我尝试第一个查询时,它会给出更多的行,我的意思是WHERE条件不起作用。我不知道,如果它与MS Access的怪癖或查询有问题。如果我的查询看起来很好,我很欣赏在访问中的替代实现'因为它根本不起作用! :)

我已阅读here不同的数据库实现以不同的方式选择。说不上来,如果它的东西具体的访问..

从Li0liQ建议之后,我尝试这样做:

@"SELECT n.borrower, a.sum, n.lender FROM Notification AS n 
    INNER JOIN Acknowledgment AS a ON a.parent_id = n.id AND [email protected] AND [email protected] 
    WHERE [email protected]" 

但我现在得到“不支持JOIN表达”一个错误。

回答

2

这是预期的,因为乘积的行为:

FROM Notification AS n, Acknowledgment AS a 

如果你有10个通知和5个确认,你会得到50行的结果,代表的通知和确认的所有可能的组合。该集合随后被WHERE子句过滤。 (这是对SQL,而不是具体到MS Access标准。)

这听起来像你需要一个JOIN

FROM Notification AS n INNER JOIN Acknowledgement AS a ON n.id = a.parent_id 

然后,您可以摆脱子查询:

WHERE [email protected] AND [email protected] AND [email protected] 

编辑

根据nawfal的要求,这里是他到达的解决方案,基本上包含上述记录修正案:

string query = @"SELECT n.borrower, a.sum, n.lender FROM Notification AS n 
      INNER JOIN Acknowledgment AS a ON a.parent_id=n.id 
      WHERE [email protected] AND [email protected] AND [email protected]"; 
+0

只是完美。接近我所想的东西! – nawfal 2012-01-12 18:17:56

+0

不需要子查询。必须满足这个条件! – nawfal 2012-01-12 18:19:41

+1

@nawfal,但应该可以通过将这些条件放入'WHERE'子句来获得相同的结果,这比子查询更有效。 – phoog 2012-01-12 18:21:46

1

在第一个查询中,您似乎试图执行JOIN
但是,您最终会执行CROSS JOIN,即您查询两个表中的所有可能组合(我敢打赌,您在Acknowledgment表中有4行)。

我希望下面的查询可以做你认为正确的方向的把戏,或至少帮助:只有通过重构查询

SELECT 
    n.borrower, a.sum, n.lender 
FROM 
    Notification AS n 
INNER JOIN 
    Acknowledgment AS a 
ON 
    a.parent_id = n.id 
WHERE 
    [email protected] AND [email protected] AND [email protected] 
+0

这似乎是一个完美的答案。回到你们一些测试:) – nawfal 2012-01-12 18:21:50

+0

当我运行这个查询时,我得到“加入”不支持来自Access的错误消息!但是我记得在访问之前成功完成了LEFT OUTER JOIN – nawfal 2012-01-12 18:27:58

+0

@nawfal不支持连接,因为您不能在'JOIN'子句中使用'AND [email protected] AND a.deleted = @ del1'。连接表达式应该将连接一侧的列与连接的另一侧关联起来。这些表达式仅使用a中的列。它们可以并入WHERE条款。 – phoog 2012-01-12 19:59:33

0

东西似乎是错误的访问,我能得到这个工作由回答者以这种方式提供:

string query = SELECT n.borrower, a.sum, n.lender FROM Notification AS n 
       INNER JOIN Acknowledgment AS a ON a.parent_id=n.id 
       WHERE [email protected] AND [email protected] AND [email protected]; 
+1

这在功能上等同于我的答案所隐含的查询。你为什么认为Access有什么问题? – phoog 2012-01-12 20:01:09

+0

@phoog功能上。我认为我在问题中更新的查询可以很好地适用于MySQL(我更习惯于),而不是在Access中。在使用MySQL和Access之后,这是我的直觉。我在JOIN语句中从未遇到任何MySQL问题。我可以理解,如果我的JOIN语句的语法错误,但是这里Access只是说JOIN表达式不受支持。从互联网上阅读更多内容后,我可以让它工作 – nawfal 2012-01-12 20:09:48

+0

让我来说说MS Access的另一个怪癖。如果我通过参数和占位符传递值来更新,我需要$ %% ^将它传递给EXACT EXACT EXACT命令,查询读取这些值。当你有一些复杂的查询'cos u cant所有的时间都在查询查询并找出哪个查询是第一次执行的,顺序等。MySQL(我相信像DB2等其他强大的数据库)也没有这个问题。另一个,Access不支持我可以在其他数据库中使用的许多顶级关键字。所有这些让我觉得它的一个Access的东西 – nawfal 2012-01-12 20:11:40