当我有许多唯一的站点/主要记录以及子记录和随后的孙记录时,我会遇到这种情况。我希望修改我的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
。
不幸的是,我需要主键来填充,并且无法使用正在使用的接口/软件进行联接。希望有一种方法可以修改上面的查询以使其起作用。
首先,将查询转换为使用外部(即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