Sql 从两个表中进行选择,其中给出的行数超出预期

Sql 从两个表中进行选择,其中给出的行数超出预期,sql,ms-access,select,multiple-tables,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

我不知道为什么会这样。我需要根据一些条件从两个表中选择几个值,这些条件在我下面尝试的查询中应该是明确的

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的一个怪癖还是查询出了什么问题。如果我的查询看起来很好,我非常感谢access中的替代实现,因为它根本不起作用!:)

我读到不同的数据库以不同的方式实现select。不知道这是否与访问有关

根据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"

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

这是预期的行为,因为笛卡尔积:

FROM Notification AS n, Acknowledgment AS a
如果您有10个通知和5个确认,那么结果中将有50行,表示通知和确认的所有可能组合。然后,该集合由
WHERE
子句过滤。(这是SQL的标准,不是MS Access特有的。)

听起来你需要一个
加入

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
编辑

根据纳瓦尔的要求,以下是他得出的解决方案,基本上包含了上述建议:

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"; 

由于笛卡尔积,这是预期行为:

FROM Notification AS n, Acknowledgment AS a
如果您有10个通知和5个确认,那么结果中将有50行,表示通知和确认的所有可能组合。然后,该集合由
WHERE
子句过滤。(这是SQL的标准,不是MS Access特有的。)

听起来你需要一个
加入

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
编辑

根据纳瓦尔的要求,以下是他得出的解决方案,基本上包含了上述建议:

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"; 

在第一个查询中,您似乎试图执行一个
连接

但是,您最终执行了
交叉联接
,即从两个表中查询所有可能的组合(我打赌
确认
表中有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

在第一个查询中,您似乎试图执行一个
连接

但是,您最终执行了
交叉联接
,即从两个表中查询所有可能的组合(我打赌
确认
表中有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

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;

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;

太完美了。接近我所想的东西!不需要子查询。必须满足这个条件@nawfal,但通过将这些条件放入
WHERE
子句中,应该可以实现相同的结果,这比子查询更有效。是的,我不知道实现这一点的方法,我的意思是,我不是连接方面的专家,因此选择了子查询方法。@nawfal Edit your question添加新的查询文本和错误消息的全文。这应该是很容易让加入工作。只是完美的。接近我所想的东西!不需要子查询。必须满足这个条件@nawfal,但通过将这些条件放入
WHERE
子句中,应该可以实现相同的结果,这比子查询更有效。是的,我不知道实现这一点的方法,我的意思是,我不是连接方面的专家,因此选择了子查询方法。@nawfal Edit your question添加新的查询文本和错误消息的全文。让join工作起来应该很容易。这似乎是一个完美的答案。测试完毕后,请回复:)当我运行此查询时,Access会显示“JOIN”不受支持的错误消息!但我记得我以前成功地与access@nawfal不支持联接,因为不能在
join
子句中使用
和a.status=@status和a.deleted=@del1
。联接表达式应该将联接的一侧的列关联到联接的另一侧。这些表达式仅使用a中的列。它们可以合并到
WHERE
子句中。@phoog正是!!我现在明白你的意思了。我的错。你能用我的帖子更新你的答案吗(它终于起作用了),这样我就可以标记它了?可以帮助像我这样的新手在将来看到一个标记为答案的工作代码。谢谢你的努力……)这似乎是一个完美的答案。测试完毕后,请回复:)当我运行此查询时,Access会显示“JOIN”不受支持的错误消息!但我记得我以前成功地与access@nawfal不支持联接,因为不能在
join
子句中使用
和a.status=@status和a.deleted=@del1
。联接表达式应该将联接的一侧的列关联到联接的另一侧。这些表达式仅使用a中的列。它们可以合并到
WHERE
子句中。@phoog正是!!我现在明白你的意思了。我的错。你能用我的帖子更新你的答案吗(它终于起作用了),这样我就可以标记它了?可以帮助像我这样的新手在将来看到工作