我不确定为什么这样做。我需要根据一些标准从两个表中选择几个值,这些标准应该从我在下面尝试的查询中清楚。
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表达式”错误。
答案 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;