我在工作中使用数据库时通常没有问题,是的,它们的结构令人困惑。但是,我可以通过......好吧,我应该生成一个查询,在该查询中,它将显示每个帐户,而没有具有CEO角色或管理员角色的用户。
每个帐户至少有3个用户,每个用户最多可以有10个不同的角色。包括行政人员或首席执行官。
AK_lAccountID
=与帐户
sAcctName
=帐户名称
PK_lCustomerID
=与客户身份相对应的ID
tUsers
=用于存储用户值的表
tCustomers
=存储客户价值的表(ID,姓名,状态等)
tSalesStatus
=存储销售状态的表
tUserRoles
=用于存储用户角色的表(管理员,CEO,用户等)
sSQLs = " SELECT DISTINCT AK_lAccountID, sAcctName, PK_lCustomerID " & _
" FROM tUsers u, tCustomers c, tSalesStatuses ss, tRegions r, tUserRoles ur " & _
" WHERE u.FK_lCustomerID = PK_lCustomerID AND " & _
" u.FK_lRegionID = PK_lRegionID AND " & _
" PK_lRegionID = 1 AND " & _
" c.FK_lSalesStatusID = ss.PK_lSalesStatusID AND " & _
" FK_lSalesStatusID = 8 AND " & _
" ur.FK_lUserID = PK_lUserID AND " & _
" ur.FK_lRoleID = FK_lRoleID AND " & _
" FK_lRoleID NOT IN (3, 15) " & _
" GROUP BY AK_lAccountID, sAcctName, PK_lCustomerID " & _
" HAVING COUNT(*) >= 2 " & _
" ORDER BY sAcctName "
此外,用户可以拥有多个角色。
无论如何,出于某种原因,它只是拉动所有记录。即使它有CEO用户或管理员。
也忘了提一下,用户角色是INT值。
CEO = 15 Admin = 3
答案 0 :(得分:1)
你需要使用exists -clause。由于你的数据库结构不是100%清楚,我认为你需要这样的东西:
SELECT
AK_lAccountID,
sAcctName,
PK_lCustomerID
FROM
tCustomers c,
tSalesStatuses ss,
tRegions r
WHERE
PK_lRegionID = 1 AND
c.FK_lSalesStatusID = ss.PK_lSalesStatusID AND
FK_lSalesStatusID = 8 AND
not exists (
select 1
from
tUsers u
join tUserRoles ur on ur.FK_lUserID = u.PK_lUserID
where
u.FK_lCustomerID = c.PK_lCustomerID AND
u.FK_lRegionID = r.PK_lRegionID AND
ur.FK_lRoleID IN (3, 15))
ORDER BY
sAcctName
或者至少你能够找到解决方法。
答案 1 :(得分:0)
这当然没有经过测试,而且很可能需要对列进行一些调整,因为我必须猜测哪些列在哪里但是这样的东西应该非常接近。
SELECT DISTINCT u.AK_lAccountID
, c.sAcctName
, c.PK_lCustomerID
FROM tUsers u
join tCustomers c on u.FK_lCustomerID = c.PK_lCustomerID
join tSalesStatuses ss on c.FK_lSalesStatusID = ss.PK_lSalesStatusID
join tRegions r on u.FK_lRegionID = r.PK_lRegionID
join tUserRoles ur on ur.FK_lUserID = u.PK_lUserID
AND ur.FK_lRoleID = u.FK_lRoleID
WHERE PK_lRegionID = 1
AND FK_lSalesStatusID = 8
AND FK_lRoleID NOT IN (3, 15)
GROUP BY u.AK_lAccountID
, c.sAcctName
, c.PK_lCustomerID
HAVING SUM(CASE WHEN ur.RoleName IN ('CEO', 'Admin') THEN 1 ELSE 0 END) = 0
ORDER BY c.sAcctName