通过联结表

时间:2015-12-10 23:02:47

标签: sql ms-access

我有一个查询,它返回我在方案表中的所有方案

SELECT DISTINCT RiskScenarios.riskScenID, RiskScenarios.riskScenName
FROM RiskScenarios

我还有一个返回与上面相同的字段的查询,但是这次使用表单上的联结表和列表框来返回特定风险适用的场景

Select RiskScenarios.riskScenID, RiskScenarios.riskScenName
FROM RiskScenarios INNER JOIN TopRiskstoScenarios
ON RiskScenarios.riskScenID = TopRiskstoScenarios.riskScenID
WHERE TopRiskstoScenarios.topRiskID = [Forms]![ERMForm]![lTopRisks]

我想要做的是在第一个查询中返回记录,同时省略第二个中的记录,我试图将其作为

SELECT DISTINCT RiskScenarios.riskScenID, RiskScenarios.riskScenName
FROM RiskScenarios
WHERE NOT EXISTS (Select RiskScenarios.riskScenID, RiskScenarios.riskScenName
FROM RiskScenarios INNER JOIN TopRiskstoScenarios
ON RiskScenarios.riskScenID = TopRiskstoScenarios.riskScenID
WHERE TopRiskstoScenarios.topRiskID = [Forms]![ERMForm]![lTopRisks])

但是,此查询不返回任何行。我完全被难过了,任何帮助都会受到高度赞赏。

1 个答案:

答案 0 :(得分:0)

试试这个:

SELECT DISTINCT RiskScenarios.riskScenID, RiskScenarios.riskScenName 
FROM RiskScenarios 
LEFT JOIN (Select TopRiskstoScenarios.riskScenID FROM TopRiskstoScenarios 
WHERE TopRiskstoScenarios.topRiskID = [Forms]![ERMForm]![lTopRisks]) AS TopRisk
ON RiskScenarios.riskScenID = TopRisk.riskScenID 
WHERE TopRisk.riskScenID IS NULL

LEFT JOIN包含“左表”RiskScenarios中的所有行,仅包含与“右表”匹配的RiskScenarios.riskScenID的记录(子查询标记为TopRisk)。

如果没有匹配的TopRisk.riskScenID,则此查询返回NULL。最终的WHERE子句删除了非空匹配,只留下RiskScenarios中没有匹配的TopRisk