SQL NOT EXIST子查询

问题描述 投票:1回答:1

当我有许多唯一的站点/主要记录以及子记录和随后的孙记录时,我会遇到这种情况。我希望修改我的SQL查询,以便它将根据是否存在孙记录来填充唯一的主要记录,然后根据子记录列进一步过滤这些主要记录。

例如

SELECT PrimaryTable.SiteKey

FROM PrimaryTable

WHERE NOT EXISTS (

    SELECT* FROM PrimaryTable, ChildTable, GrandChildTable

    WHERE PrimaryTable.SiteKey = ChildTable.SiteKey and Childtable.Key = GrandChildTable.ParentKey)

此方法可以填充具有子记录但没有孙记录的站点/主记录列表。

如果要在主表上进一步过滤,可以在查询的末尾添加AND PrimaryTable.Column1 = 'MyDesiredValue',它可以正常工作。但是,我想通过ChildTable.Column != 'MyDesiredValue'对其进行过滤。

[执行此操作时,出现错误,表明该参数未绑定,并且在查询开始时未列出ChildTable

不幸的是,我需要主键来填充,并且无法使用正在使用的接口/软件进行联接。希望有一种方法可以修改上面的查询以使其起作用。

sql
1个回答
0
投票

首先,将查询转换为使用外部(即LEFT)联接,该联接将筛选出没有大子级的行。然后将过滤器添加到联接中:

SELECT distinct PrimaryTable.SiteKey -- distinct, or it'll repeat every join
FROM PrimaryTable
JOIN ChildTable on PrimaryTable.SiteKey = ChildTable.SiteKey -- inner (required) join
    AND ChildTable.Column != 'MyDesiredValue'
LEFT JOIN GrandChildTable on Childtable.Key = GrandChildTable.ParentKey
WHERE GrandChildTable.ParentKey IS NULL -- only rows without grandchildren
© www.soinside.com 2019 - 2024. All rights reserved.