我一直在撞墙,因为我觉得应该很简单,但却无法开始工作。
当我加入表A和表B时,我正在尝试检索具有最高multi_flag值的行但是我似乎无法使SQL正确,因为它返回所有行而不是具有最高 multi_flag值的那个。
这是我的表......
表A
表B
这几乎是我想要的结果,但如果我遗漏value_id
行>>
SELECT CATALOG, VENDOR_CODE, INVLINK, NAME_ID, MAX(multi_flag) AS multiflag
FROM TBLINVENT_ATTRIBUTE AS A
INNER JOIN TBLATTRIBUTE_VALUE AS B
ON A.VALUE_ID = B.VALUE_ID
GROUP BY CATALOG, VENDOR_CODE, INVLINK, NAME_ID
ORDER BY CATALOG DESC
这与我想要撤消的内容很接近,但并不完全注意它如何返回唯一name_id
和最高multi_flag
,但我还需要属于value_id
的{{1}} } / multi_flag
分组...
如果我在我的SQL语句中包含value_id,那么它将返回所有行并且不再分组
注意以下结果如何不再返回最高name_id
的行以及如何返回multi_flag
(例如name_id
1)的所有不同值
答案 0 :(得分:1)
您可以选择使用子查询,派生表或CTE来解决此问题。性能取决于您查询的数据量。要实现获取max multiflag的目标,必须首先根据要实现的分组获取最大值,然后才能使用CTE或子查询。下面的CTE将给出max multi_flag值,您可以使用它来获取max multi_flag,然后您可以使用它来连接回其他表。我在这个例子中有三个连接,但这可以减少,并且就性能而言,使用子查询可能更好,但是你需要知道,直到你得到实际的执行计划并排。
; high_multi_flag为 ( select value_id,max(multi_flag)AS multiflag 来自TBLINVENT_ATTRIBUTE 按value_id分组 ) 选择A.CATALOG,a.VENDOR_CODE,a.INVLINK,b.NAME_ID,m.multiflag 来自highest_multi_flag m 内联接TBLINVENT_ATTRIBUTE作为a.VALUE_ID = b。 m.VALUE_ID INNER JOIN TBLATTRIBUTE_VALUE作为B ON m.VALUE_ID = B.VALUE
答案 1 :(得分:0)
您也可以使用Lateral,这是另一种解决方案
SELECT
A.CATALOG, A.VENDOR_CODE, A.INVLINK, B.NAME_ID, M.maxmultiflag
FROM TBLINVENT_ATTRIBUTE AS A
inner join lateral
(
select max(B.multi_flag) as maxmultiflag from TBLINVENT_ATTRIBUTE C
where A.VALUE_ID = C.VALUE_ID
) M on 1=1
INNER JOIN TBLATTRIBUTE_VALUE AS B ON M.maxmultiflag = B.VALUE