SQL关系混乱

时间:2015-08-06 18:24:37

标签: sql

我在工作中使用数据库时通常没有问题,是的,它们的结构令人困惑。但是,我可以通过......好吧,我应该生成一个查询,在该查询中,它将显示每个帐户,而没有具有CEO角色或管理员角色的用户。

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

列数

AK_lAccountID =与帐户

对应的ID

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

2 个答案:

答案 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