我试图从两个表中为每个服务只选择一行register_date。
但是,如果客户端具有更多具有相同register_date的行,则查询的输出包括多行。
我该如何解决这个问题?
我必须从两张桌子中选择。
我的代码是:
SELECT tServices.Client_id, tRegister.register_date,
tServices.type_service,
tServices.start_date, tServices.end_date
FROM tServices INNER JOIN tRegister
ON tRegister.Client_id = tServices.ClientId AND
tServices.type_service IN (3,2)
WHERE tRegister.register_date =
(SELECT top 1 tRegister2.register_date
FROM tRegister as tRegister2
WHERE tRegister2.ClientId = tServices.ClientId
ORDER BY tRegister2.register_date asc)
对于一个客户端,输出如下所示,但我希望在输出中看到一行。
Client_Id register_date Type_Service Start_Date End_Date
1001 21-11-2018 2 17-01-2019 19-3-2019
1001 21-11-2018 2 17-12-2018 19-3-2019
您可以使用apply
运算符:
select *
from tServices s
cross apply (
select top (1) * from tRegister r
where r.Client_id = s.ClientId
order by r.register_date
) ca;
请注意,有两个版本的apply
:
cross
(相当于inner
加入);outer
,作为left outer
加入。在上面的查询中,对于没有注册的客户端,您将看不到tServices
中的任何行。如果您仍然需要它们,请将cross
替换为outer
。