从两个表中选择,提供比预期更多的行

时间:2012-01-12 18:07:20

标签: sql ms-access select multiple-tables

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

query = @"SELECT n.borrower, a.sum, n.lender FROM Notification AS n, Acknowledgment AS a 
          WHERE n.deleted=@del2 AND n.id IN (SELECT parent_id FROM Acknowledgment
                                             WHERE status=@status AND deleted=@del1)";

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

我有两个表Notification和Acknowledge都有字段“sum”。当我尝试下面的查询时,它会按预期提供正确的3行。

@"SELECT n.borrower, n.sum, n.lender FROM Notification AS n 
  WHERE n.deleted=@del2 AND n.id IN (SELECT parent_id FROM Acknowledgment
                                     WHERE status=@status AND deleted=@del1)";

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

我已阅读here,不同的数据库以不同的方式实现选择。 Dunno,如果它具有特定的访问权限..

在Li0liQ的建议之后,我尝试了这个:

@"SELECT n.borrower, a.sum, n.lender FROM Notification AS n 
  INNER JOIN Acknowledgment AS a ON a.parent_id = n.id AND a.status=@status AND a.deleted=@deleted1 
  WHERE n.deleted=@deleted2"

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

3 个答案:

答案 0 :(得分: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 n.deleted=@del2 AND a.status=@status AND a.deleted=@del1

修改

根据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 a.status=@status AND a.deleted=@deleted1 AND n.deleted=@deleted2"; 

答案 1 :(得分: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
    n.deleted=@del2 AND a.status=@status AND a.deleted=@del1

答案 2 :(得分:0)

Access似乎有些问题,我只能通过以这种方式重新构建回答者提供的查询来实现这一点:

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 a.status=@status AND a.deleted=@deleted1 AND n.deleted=@deleted2;