如何在SQL加入后只返回结果的计算值?

How to only return a calculated value to results after a SQL join?

提问人:Tim Wheeler 提问时间:5/11/2023 最后编辑:SkullyTim Wheeler 更新时间:11/15/2023 访问量:71

问:

我有两个表,我只想将查询的开始日期添加到 上的值中。开始日期由语句推导,例如:table2table1GROUP BY

表1

编号 总结 结束
1 标题 01/01/2023
2 标题 2 02/02/2023

表2

编号 总结 开始 家长 ID
3 标题 01/10/2022 1
4 标题 2 02/10/2023 1
5 标题 3 03/10/2023 2

我希望表 1 的所有内容都只包含表 2 中每个父 ID 的最短开始日期。

我尝试了这样的事情,但我无法返回额外的列,我猜我需要用子句更改一些东西?GROUP BY

SELECT table1.*, t2.Start
FROM table1 INNER JOIN 
(
    SELECT [Parent ID], min(Start)
    FROM table2
    GROUP BY [Parent ID]
) t2 ON t2.[Parent ID] = t1.ID
sql alasql

评论

0赞 Tim Wheeler 5/11/2023
我应该补充一点,我目前只获得查询中返回的 ParentID 和 Start 值。我想要 ID、Summary、Start、End 值
1赞 Luuk 5/11/2023
当您想向问题添加内容时,您应该使用 edit
0赞 jarlh 5/11/2023
一个最小的可重复的例子也应该包括预期的结果。

答:

1赞 MAHDI Saghafi Zadeh 5/11/2023 #1
;with a as(
Select row_number() over (PARTITION BY Table1.id order by table2.start) as 'row',table1.*,table2.start)
from table1 left join table2 on table1.id=table2.id)
select * from a where row=1
2赞 Rams 5/11/2023 #2
SELECT t1.*, t2.Start
FROM table1 t1 inner join 
    (
        select [Parent ID], min(Start) as Start
        from table2
        group by [Parent ID]
    ) t2 on t2.[Parent ID] = t1.ID
2赞 SelVazi 5/11/2023 #3

另一种方法是使用 和 聚合函数:GROUP BYmin()

select t1.ID, max(t1.Summary) as Summary, max(t1.End) as End, min(t2.Start_) as min_start
from table1 t1
inner join table2 t2 on t1.id = t2.Parent_ID
group by t1.ID
1赞 toha 5/11/2023 #4

另一种解决方案是,而不是使用子句,而是在子查询中获取结果。GROUP BY

SELECT t1.*, (
    SELECT min(Start)
    FROM table2 t2
    WHERE t2.ParentID = t1.ID
) 
FROM table1 t1;

评论

1赞 Skully 5/12/2023
请记住,Stack Overflow 不仅旨在解决眼前的问题,还旨在帮助未来的读者找到类似问题的解决方案,这需要了解底层代码。这对于我们社区中不熟悉语法的初学者来说尤其重要。鉴于此,您能否编辑您的答案以包括对您正在做的事情的解释以及您为什么认为这是最好的方法?
1赞 Skully 5/14/2023
这是一个解决方案共享平台,给出答案是其中的一部分,但解释它以让未来的读者了解解决方案的作用同样重要。虽然这不是规则,但强烈建议这样做。
1赞 mathiasrw 11/15/2023 #5

您需要修改子查询以将 包含在选择列表中,以便它可用于联接的外部查询。例:Parent ID

SELECT table1.*, t2.MinStart
FROM table1
INNER JOIN (
    SELECT [Parent ID], MIN(Start) as MinStart
    FROM table2
    GROUP BY [Parent ID]
) as t2 ON t2.[Parent ID] = table1.ID

此查询检索每个相应 .子查询用于计算 中每个 的最小开始日期,然后将此结果联接到列上。table1table2Parent IDParent IDtable2table1ID