PID (type VARCHAR) ATTR (type VARCHAR)
U1 attribute1
U1 locale
U2 attribute1
U2 locale
U3 attribute1
U3 attribute2
我想做的是选择所有不包含“locale”字符串的记录的PID,并且这些记录在ATTR列中不存在,因此在我展示的示例中,该查询应返回“U3”。
我尝试过类似以下的查询:
SELECT DISTINCT PID p
FROM tablename
WHERE NOT EXISTS (SELECT * FROM table
WHERE PID = 'p' AND ATTR NOT IN 'locale');
类似的东西,但我要么没有正确理解SQL语法,要么在犯一些其他错误——我没有得到正确的结果。
有人知道可能出了什么问题吗?
P.S. 由于我得到的反馈,我必须做错了什么,请允许我补充一些信息,也许这会有所帮助。
我谈论的表是一个SAP J2EE堆栈标准表(UME_STRINGS),包含用户数据(SAP术语中的UME——用户管理引擎)。除了PID和ATTR之外,它还包含许多其他字段,我没有考虑它们,因为它们似乎不重要。
然而,我需要找到所有没有设置区域设置的用户帐户。由于用户管理显然是“懒惰”的,因此只有在设置区域设置时才会创建这样的记录(具有任意PID和值“locale”在ATTR中的记录)。这实际上意味着表中存在许多用户的任意记录(相同的PID值),但是这些记录中没有一个在ATTR字段中有一个值'locale'。因此,算法可以是:
1.)将表聚类到相同的PID上
2.)在每个群集内迭代并检查是否在此群集内没有具有'locale'在ATTR字段中的记录,如果是,则将此PID添加到输出
3.)返回找到的PID列表
所有这些都最好用单个SQL查询完成。
可用的JAVA API(com.sap.security.api.IUserSearchFilter)不允许您设置空值进行搜索,因此我别无选择,只能直接询问DB。
除了“locale”记录之外,当然还有许多其他记录,因为每个用户、组、角色等的每个属性都是以这种方式建模的——像U1 - attribute1之类的东西。
所以我需要一个查询,给我没有像“PID - 'locale' in ATTR”的条目的PID的用户。
如果我的描述令人困惑或不完整,请问。再次感谢
P.P.S. 添加了一些带有示例数据和表结构的屏幕截图
select count(PID) where PID is null
)。 - user5683823