Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
加入所需的SQL Server查询帮助_Sql_Sql Server_Database_Tsql - Fatal编程技术网

加入所需的SQL Server查询帮助

加入所需的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

我在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,
    [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
但我想做以下几件事

  • 我想返回所有拥有“摩托车保险”的客户以及其他没有“摩托车保险”的客户
  • TypeName
    对于没有“MotorcycleInsurance”的用户,将以NULL返回
  • 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;