【问题标题】:Needed helpful hand with a bit complicated query需要帮助的手有点复杂的查询
【发布时间】:2019-05-31 00:57:11
【问题描述】:

我有一个具有以下结构的表“任务”

[TaskId],[CompanyId], [Year], [Month], [Value]
220,1,2018,1,50553.32
220,2,2018,2,222038.12

还有另一个表,其中用户有权访问名为“UsersCopmpanies”的表中的特定公司

[UserId], [CompanyId]
1,1

问题是任务号。 220 在公司之间转移。 1 月份的任务属于 copmanyId=1,而 2 月份这个任务属于 copmanyId = 2。

根据表“UsersCopmpanies”,用户没有 compnayid = 2 的权限。

我需要做的是从表“任务”期望字段值中获取两行,因为用户没有权限。 预期结果应该是:

[TaskId], [CompanyId], [Year], [Month],[Value]
220,1,2018,1,50553.32
220,2,2018,2,(NULL or somenthing else for.example string 'lack of permission')

【问题讨论】:

  • 您是否考虑过保留历史记录表,以便用户仍然可以访问一些以前可能与他们相关的信息?这并不意味着他们将能够访问当前数据,但这意味着他们仍然可以看到在他们离开的状态下不再分配的东西。
  • 旁白:在您的问题中使用分类数据类型让我们猜测,但有一列具有多种数据类型,例如money 或 varchar(42) 取决于另一个表中的值,不会顺利进行。

标签: sql sql-server database tsql sql-server-2008


【解决方案1】:

您可以使用left join:

select t.TaskId, t.CompanyId, t.Year, t.Month, 
       (case when uc.CompanyId is not null then Value end) as Value
from tasks t left join
     UsersCompanies uc
     on uc.CompanyId = t.CompanyId and uc.UserId = 1;

【讨论】:

    【解决方案2】:

    我认为这个使用 LEFT JOIN 的查询可以按你的预期工作:

    CREATE TABLE #MyTasks  
    (TaskId   int,  
       CompanyId      int,
       YearCol varchar(50),
       MonthCol varchar(50),
       SomeValue varchar(50)
      );  
    GO  
    
    INSERT INTO #MyTasks 
    SELECT 220,1,2018,1,50553.32
    UNION
    SELECT 220,2,2018,2,222038.12
    
    CREATE TABLE #MyUsersCopmpanies
    (UserId   int PRIMARY KEY,  
       CompanyId      varchar(50) 
      );  
    GO  
    
    
    
    INSERT INTO #MyUsersCopmpanies 
    SELECT 1,1
    
    
    DECLARE  @MyUserParam INT = 1;
    
    SELECT #MyTasks.TaskId, #MyTasks.CompanyId, #MyTasks.YearCol, #MyTasks.MonthCol, 
        CASE WHEN #MyUsersCopmpanies.UserId IS NOT NULL THEN  #MyTasks.SomeValue ELSE 'lack of permission' END AS 'ValueTaskByPermissions'
    FROM #MyTasks 
    LEFT JOIN #MyUsersCopmpanies ON #MyUsersCopmpanies.CompanyId = #MyTasks.CompanyId AND #MyUsersCopmpanies.UserId = @MyUserParam;
    
    
    DROP TABLE  #MyTasks
    
    DROP TABLE  #MyUsersCopmpanies
    

    结果:

    TaskId  CompanyId   YearCol MonthCol    ValueTaskByPermissions
    220             1      2018        1    50553.32
    220             2      2018        2    lack of permission
    

    【讨论】:

      【解决方案3】:

      一些代码:

      SELECT t.taskid,t.companyid,t.year,t.month, 
             (CASE WHEN u.companyid IS NOT NULL THEN t.value ELSE "lack of permission" end) AS ValueData 
      FROM `x_task` t LEFT JOIN x_userscopmpanies u ON u.companyid = t.companyid 
      

      【讨论】:

      • 请编辑您的答案并将代码放在工具栏中的 { } 标记中。
      • 作为它的依赖权限,如果用户有公司,那么它会显示该值,如果没有则没有,所以不需要检查用户ID,
      猜你喜欢
      • 1970-01-01
      • 2013-10-28
      • 1970-01-01
      • 2012-06-26
      • 2023-03-27
      • 1970-01-01
      • 2021-03-04
      • 2020-02-17
      • 2022-01-13
      相关资源
      最近更新 更多