加入所需的SQL Server查询帮助
我在SQL Server 2012中有这三个表加入所需的SQL Server查询帮助,sql,sql-server,database,tsql,Sql,Sql Server,Database,Tsql,我在SQL Server 2012中有这三个表 CREATE TABLE [dbo].[ClientInfo] ( [ClientID] [int] IDENTITY(1,1) NOT NULL, [ClientName] [varchar](50) NULL, [ClientAddress] [varchar](50) NULL, [City] [varchar](50) NULL, [State] [varchar](50) NULL, [DO
CREATE TABLE [dbo].[ClientInfo]
(
[ClientID] [int] IDENTITY(1,1) NOT NULL,
[ClientName] [varchar](50) NULL,
[ClientAddress] [varchar](50) NULL,
[City] [varchar](50) NULL,
[State] [varchar](50) NULL,
[DOB] [date] NULL,
[Country] [varchar](50) NULL,
[Status] [bit] NULL,
PRIMARY KEY (ClientID)
)
CREATE TABLE [dbo].[ClientInsuranceInfo]
(
[InsID] [int] IDENTITY(1,1) NOT NULL,
[ClientID] [int] NULL,
[InsTypeID] [int] NULL,
[ActiveDate] [date] NULL,
[InsStatus] [bit] NULL,
PRIMARY KEY (InsID)
)
CREATE TABLE [dbo].[TypeInfo]
(
[TypeID] [int] IDENTITY(1,1) NOT NULL,
[TypeName] [varchar](50) NULL,
PRIMARY KEY (TypeID)
)
一些示例数据用于执行查询
insert into ClientInfo (ClientName, State, Country, Status)
values ('Lionel Van Praag', 'NSW', 'Australia', 'True')
insert into ClientInfo (ClientName, State, Country, Status)
values ('Bluey Wilkinson', 'NSW', 'Australia', 'True')
insert into ClientInfo (ClientName, State, Country, Status)
values ('Jack Young', 'NSW', 'Australia', 'True')
insert into ClientInfo (ClientName, State, Country, Status)
values ('Keith Campbell', 'NSW', 'Australia', 'True')
insert into ClientInfo (ClientName, State, Country, Status)
values ('Tom Phillis', 'NSW', 'Australia', 'True')
insert into ClientInfo (ClientName, State, Country, Status)
values ('Barry Smith', 'NSW', 'Australia', 'True')
insert into ClientInfo (ClientName, State, Country, Status)
values ('Steve Baker', 'NSW', 'Australia', 'True')
insert into TypeInfo (TypeName) values ('CarInsurance')
insert into TypeInfo (TypeName) values ('MotorcycleInsurance')
insert into TypeInfo (TypeName) values ('HeavyVehicleInsurance')
insert into ClientInsuranceInfo (ClientID, InsTypeID, ActiveDate, InsStatus)
values ('1', '1', '2000-01-11', 'True')
insert into ClientInsuranceInfo (ClientID, InsTypeID, ActiveDate, InsStatus)
values ('1', '2', '2000-01-11', 'True')
insert into ClientInsuranceInfo (ClientID, InsTypeID, ActiveDate, InsStatus)
values ('2', '1', '2000-01-11', 'True')
insert into ClientInsuranceInfo (ClientID, InsTypeID, ActiveDate, InsStatus)
values ('2', '2', '2000-01-11', 'True')
insert into ClientInsuranceInfo (ClientID, InsTypeID, ActiveDate, InsStatus)
values ('2', '3', '2000-01-11', 'True')
insert into ClientInsuranceInfo (ClientID, InsTypeID, ActiveDate, InsStatus)
values ('3', '1', '2000-01-11', 'True')
insert into ClientInsuranceInfo (ClientID, InsTypeID, ActiveDate, InsStatus)
values ('4', '1', '2000-01-11', 'True')
insert into ClientInsuranceInfo (ClientID, InsTypeID, ActiveDate, InsStatus)
values ('4', '3', '2000-01-11', 'True')
insert into ClientInsuranceInfo (ClientID, InsTypeID, ActiveDate, InsStatus)
values ('5', '2', '2000-01-11', 'True')
我编写了以下查询,只返回具有“MotorkeInsurance”类型的客户:
select distinct
ClientInfo.ClientID, ClientInfo.ClientName, TypeInfo.TypeName
from
ClientInfo
left join
ClientInsuranceInfo on ClientInfo.ClientID = ClientInsuranceInfo.ClientID
left join
TypeInfo on ClientInsuranceInfo.InsTypeID = TypeInfo.TypeID
and TypeInfo.TypeID = 2
where
typeinfo.TypeName is not null
但我想做以下几件事
- 我想返回所有拥有“摩托车保险”的客户以及其他没有“摩托车保险”的客户
对于没有“MotorcycleInsurance”的用户,将以NULL返回TypeName
在结果集中必须是唯一的ClientID
- 不想使用
/UNION
UNION ALL
只需删除
where
子句并稍微更改连接条件即可
select distinct ClientInfo.ClientID, ClientInfo.ClientName, TypeInfo.TypeName
from ClientInfo
left join ClientInsuranceInfo
on ClientInfo.ClientID = ClientInsuranceInfo.ClientID
and ClientInsuranceInfo.InsTypeID = 2
left join TypeInfo on ClientInsuranceInfo.InsTypeID = TypeInfo.TypeID
使用
行号
尝试此选项:
select a.ClientID, a.ClientName, a.TypeName
from
(
select distinct ClientInfo.ClientID, ClientInfo.ClientName, TypeInfo.TypeName, ROW_NUMBER() over(partition by ClientInfo.ClientID order by case when TypeName is null then 1 else 0 end) as rn
from ClientInfo
left join ClientInsuranceInfo on ClientInfo.ClientID = ClientInsuranceInfo.ClientID
left join TypeInfo on ClientInsuranceInfo.InsTypeID = TypeInfo.TypeID and TypeInfo.TypeID = 2
) a
where rn = 1
编辑:通过
行编号:)中的case
语句更新排序,前导比美国宪法长,您应该花点时间准确地向我们显示您希望看到的输出。如果我删除'where'子句,则某些ClientID将多次返回。哪个客户有其他保险类型以及“摩托车保险”类型,它们将被多次退回。但是我需要返回唯一的clientID。在加入客户机表时,您需要过滤掉其他类型,因为您不需要它们。因此,当您使用TypeInfo时,您将避免重复。或者,可以更改联接的顺序。这也会起作用的。这对我很有帮助。但是'ROW_NUMBER()over(按ClientInfo.ClientID按大小写划分,当TypeName为null时,则为1,否则为0 end)作为rn'我可以像TypeName一样放置多列条件吗?有什么建议吗?'ROW_NUMBER()over(按ClientInfo.ClientID按大小写划分,当TypeName为null时,则为1,否则为0结束)作为rn'为什么将TypeName设置为null,然后为1,否则为0,在条件rn=1的情况下,这只是我定义排序的方式-首先为非null值(0),然后为null值将为升序的值1:)
SELECT CI.ClientID, CI.ClientName, TI.TypeName
FROM dbo.ClientInfo AS CI
LEFT JOIN (SELECT ClientID, InsTypeID
FROM dbo.ClientInsuranceInfo
WHERE InsTypeID = 2
GROUP BY ClientID, InsTypeID ) AS CII ON CI.ClientID = CII.ClientID
LEFT JOIN dbo.TypeInfo AS TI ON CII.InsTypeID = TI.TypeID;