首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL关系混淆

SQL关系混淆
EN

Stack Overflow用户
提问于 2015-08-07 02:24:37
回答 2查看 48关注 0票数 1

我通常在工作中使用数据库没有问题,是的,他们的结构是令人困惑的。但是,我能挺过去。好吧,我应该生成一个查询,在这个查询中,它将显示没有拥有CEO角色或Admin角色的用户的每个帐户。

每个账号至少有3个用户,每个用户最多可以有10个不同的角色。包括管理员或首席执行官。

Cols

AK_lAccountID =账号对应的ID

sAcctName =帐户名

PK_lCustomerID =客户标识对应的ID

表格

tUsers =用于存储用户值的表

tCustomers =用于存储客户值(ID、名称、状态等)的表

tSalesStatus =用于存储销售状态的表

tUserRoles =存储用户角色(管理员、首席执行官、用户等)的表

代码语言:javascript
复制
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管理员=3

EN

回答 2

Stack Overflow用户

发布于 2015-08-07 02:41:32

为此,您需要使用exists -clause。由于您的数据库结构对我来说并不是100%清楚,所以我假设您需要这样的东西:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2015-08-07 02:41:09

这当然还没有经过测试,而且很可能需要对列进行一些调整,因为我不得不猜测列在哪里,但像这样的东西应该非常接近。

代码语言:javascript
复制
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 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31863154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档