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