【问题标题】:TSQL - Query to list A and B's columns, A left join, keeping the main tableTSQL - 查询列出 A 和 B 的列,A 左连接,保留主表
【发布时间】:2016-09-29 21:06:55
【问题描述】:

我不能很好地解释我要做什么,但是。

我有一个表 A,它是我的表 B 的一系列参数,其中包含每个用户及其权限。

Wood?

表用户
用户 ID、名称

表格参数
参数Id,参数名称

表权限
PermissionId、ParameterId、UserId、X、Y、Z(X、Y、Z都是布尔值)

所以。我想要的是;所有参数的列表,每个用户,有或没有,它的权限。

应该是这样的;

SELECT

p.ParameterName,
pm.X,
pm.Y,
pm.Z

FROM Parameters p
LEFT JOIN Permissions pm ON pm.PermissionId = p.Id
AND (pm.UserId IS NULL OR pm.UserId = @UserId) 

基本上,我想要所有参数,并且我需要知道我提供的用户是否拥有每个特定参数的权限。

LEFT JOIN 对我来说效果不是很好,当用户没有权限时,它不会让我获得所有参数...

但是。

我设法做到了;

SELECT

 p.ParameterName,
 (SELECT X FROM Permissions WHERE ParameterId = p.Id And UserId = @UserId) [X]
-- *repeat logic for Y and Z*

FROM Parameters p

第二个查询运行良好,但我知道它在质量和性能上都不是很好。我不知道我的表结构是否是我能做的最好的。

我考虑过每行都做,而不是在一行中做所有权限类型。

类似的东西。

实际 - 权限
PermissionId, ParameterId, UserId, X, Y, Z. (XYZ bit/boolean)

我首先想到的东西 - 权限 PermissionId、ParameterId、UserId、类型
(类型将是一个包含 X、Y 和 Z 的枚举)。但是使用这种逻辑我会在查询所有权限时遇到更多问题,因此,我认为如果我将它们放在一行中会更好。

我是否设法解释了我的问题以及我需要什么?

还有什么我可以做的,或者第二个查询可以正常工作吗?

谢谢。

【问题讨论】:

  • 乍一看LEFT JOIN不对应该是LEFT JOIN Permissions pm ON pm.ParameterId= p.Id

标签: sql-server


【解决方案1】:
SELECT
    p.ParameterName,
    pm.X,
    pm.Y,
    pm.Z
FROM Parameters p
LEFT JOIN Permissions pm ON pm.ParameterId = p.Id
AND (pm.UserId IS NULL OR pm.UserId = @UserId) 

【讨论】:

  • 弗里克。我很尴尬。我把where子句做错了,至少我的心里是对的,哈哈。谢谢。我会尽快接受这是正确的。
猜你喜欢
  • 2019-07-29
  • 2021-03-16
  • 2021-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多