【问题标题】:Select Max And Inner Join选择 Max 和 Inner Join
【发布时间】:2017-07-06 08:28:27
【问题描述】:

我有 SQL Server 2012 数据库,我需要查询数据库并获取与 MAX(Rule_ID) AND MAX(CI_ID) 相关的结果

但我无法获得与 MAX(CI_ID) 相关的结果,所有 CI_ID 版本都在结果中。

USE CM_T01
SELECT Max_id, MAX(CIVersion), Netbios_Name0, RuleName, RuleDescription, prereifiedvalue, complianceState
FROM v_CI_CurrentComplianceStatus
INNER JOIN 
(
SELECT CI_ID,Rule_ID, Rulename,  RuleDescription,criteria, MAX(Rule_ID) OVER(PARTITION BY Rulename) AS Max_id
from v_cirules
where rulename like '%Account lockout duration%' AND RuleDescription like '%applicable%'
group by Rule_ID,RuleName, RuleDescription,CI_ID,Criteria) as v_CIRules 
ON v_CIRules.CI_ID = v_CI_CurrentComplianceStatus.CI_ID
INNER JOIN v_R_System 
ON v_R_System.ResourceID = v_CI_CurrentComplianceStatus.ItemKey
LEFT JOIN v_CICurrentRuleDetail 
ON v_CICurrentRuleDetail.CurrentComplianceStatusID = v_CI_CurrentComplianceStatus.CI_CurrentComplianceStatusID
where netbios_name0='TRISTSCCM-PS'
GROUP BY Netbios_Name0, RuleName, RuleDescription, prereifiedvalue, complianceState,v_cirules.CI_ID,v_CIRules.Max_id,Criteria

结果

Max_id  (No column name)    Netbios_Name0   RuleName    RuleDescription prereifiedvalue complianceState
16780130    4   TRISTSCCM-PS    OS Hardening: Account Lockout Policy - Account lockout duration Applicable /Account lockout duration Must equal to 10   NULL    1
16780130    8   TRISTSCCM-PS    OS Hardening: Account Lockout Policy - Account lockout duration Applicable /Account lockout duration Must equal to 10   NULL    1
16780130    12  TRISTSCCM-PS    OS Hardening: Account Lockout Policy - Account lockout duration Applicable /Account lockout duration Must equal to 10   NULL    1

【问题讨论】:

  • 使用 with with ruleId = max(ruleid)
  • 您在 2 个内连接后使用左连接,它会返回多行。尝试使用内部连接并尝试重新运行查询,或使用 row_num 函数返回最大行数
  • 嗨,谢谢。当我删除第三个加入时,没有任何改变。
  • 您好,您可以为所有表格发布一些示例数据,这样会有所帮助。如果不是,则在您的情况下,您将在特定组中采用最大规则 ID,因此将为多个组重复规则 ID。更好地获取最大规则 ID 并将其用于 CTE 的后续查询
  • 您在这里有不同的CIVersion 值 - 如果您可以将这些汇总出来(如max(CIVersion) as CIVersion)并将其从group by 子句中删除,那么您可能会得到正确的结果。

标签: sql sql-server sql-server-2012


【解决方案1】:
USE CM_T01
SELECT Max_id, CIVersion, Netbios_Name0, RuleName, RuleDescription, Criteria, prereifiedvalue, complianceState
FROM v_CI_CurrentComplianceStatus
INNER JOIN 
(
SELECT CI_ID,Rule_ID, Rulename,  RuleDescription, MAX(Rule_ID) OVER(PARTITION BY Rulename) AS Max_id
from v_cirules
where rulename like '%Account lockout duration%'
group by Rule_ID,RuleName, RuleDescription) as v_CIRules 
ON v_CIRules.CI_ID = v_CI_CurrentComplianceStatus.CI_ID
INNER JOIN v_R_System 
ON v_R_System.ResourceID = v_CI_CurrentComplianceStatus.ItemKey
LEFT JOIN v_CICurrentRuleDetail 
ON v_CICurrentRuleDetail.CurrentComplianceStatusID = v_CI_CurrentComplianceStatus.CI_CurrentComplianceStatusID
GROUP BY CIVersion, Netbios_Name0, RuleName, RuleDescription, Criteria, prereifiedvalue, complianceState

【讨论】:

  • MAX(Rule_ID)附近有问题,Message是; "'('.expecting ')、EXPECT 或 UNION 附近的语法不正确"
  • 已修复请尝试运行子查询进行测试。你明白为什么需要它吗?
  • 谢谢,但这些行还有另一个问题; ON v_CIRules.CI_ID = v_CI_CurrentComplianceStatus.CI_ID -------------------------------- 列名“CI_ID”无效。消息 207,第 16 层,状态 1,第 15 行
  • 我将 CI_ID 放入子选择中。
  • Msg 8120,Level 16,State 1,Line 6 列 'v_cirules.CI_ID' 在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。消息 207,级别 16,状态 1,第 15 行无效的列名“条件”。消息 207,级别 16,状态 1,第 2 行无效的列名称“条件”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-22
  • 1970-01-01
  • 1970-01-01
  • 2016-01-15
  • 1970-01-01
  • 1970-01-01
  • 2021-10-18
相关资源
最近更新 更多