2017-04-24 26 views
0

我试图连接3个表。使用CASE的SQL Server中的条件内部连接

我的第一个表是Order_Header与主键Id和两个外键User_IdUser表,Guest_IdGuest表。

如果Order_HeaderGuest_Id的值是0,我想做一个inner joinUser表,如果User_Id值是0,我想joinGuest表。

我该如何做到这一点?

Select 
    Order_No, [user].Id, [User].Email, [Guest].Id, Guest.Email 
from 
    Order_Header OH 
left join 
    [User] on OH.User_Id = [User].Id and OH.User_Id <> 0 
left join 
    [Guest] on OH.Guest_Id = [Guest].Id and OH.User_Id = 0 
where 
    (case OH.User_Id 
     when 1 then [User].Email 
     else [Guest].Email 
    end as SomeField) 
+0

它通常是更好地使用和/或代替WHERE和ON子句CASE表达式。 – jarlh

+2

添加一些示例表格数据和预期结果 - 以及格式化文本。 – jarlh

回答

-1

你可以试试这个代码:

Select Order_No, [user].Id, [User].Email, [Guest].Id, Guest.Email from Order_Header OH 
left join [User] ON OH.User_Id = [User].Id AND OH.User_Id <> 0 
left join [Guest] ON OH.Guest_Id = [Guest].Id AND OH.User_Id = 0 
0

尽量不要在条件使用情况选择:

Select Order_No, 
    [user].Id, 
    [Guest].Id, 
    CASE WHEN OH.User_Id = 0 THEN [Guest].Email 
     ELSE [User].Email, 
from Order_Header OH 
    left join [User] ON OH.User_Id = [User].Id 
    left join [Guest] ON OH.Guest_Id = [Guest].Id 
0

您的查询几乎是正确的,你唯一缺少的一对夫妇​​3210在select而不是where子句(这在语法上是错误的)

Select Order_No, 
     coalesce(usr.Id, [Guest].Id) as someID 
     coalesce(usr.Email, Guest.Email) as someEmail 
from Order_Header OH 
left join 
     [User] as usr 
ON  OH.User_Id = usr.Id AND OH.User_Id <> 0 
left join 
     [Guest] as gst 
ON  OH.Guest_Id = gst.Id AND OH.User_Id = 0 

这样你只会有一个ID柱和一个Email列,各填充了值从User(如果可用),或从Guest其他。

0

考虑以下定义表

CREATE TABLE [dbo].[User](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [Email] [varchar](max) NULL, 
CONSTRAINT [PK_User] PRIMARY KEY CLUSTERED 
(
    [Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 

GO 

CREATE TABLE [dbo].[Guest](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [Email] [varchar](max) NULL, 
CONSTRAINT [PK_Guest] PRIMARY KEY CLUSTERED 
(
    [Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 

GO 

CREATE TABLE [dbo].[Order_Header](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [User_Id] [int] NULL, 
    [Guest_Id] [int] NULL, 
    [Order_No] [int] NULL, 
CONSTRAINT [PK_Order_Header] PRIMARY KEY CLUSTERED 
(
    [Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

ALTER TABLE [dbo].[Order_Header] WITH CHECK ADD CONSTRAINT [FK_Order_Header_Guest] FOREIGN KEY([Guest_Id]) 
REFERENCES [dbo].[Guest] ([Id]) 
GO 

ALTER TABLE [dbo].[Order_Header] CHECK CONSTRAINT [FK_Order_Header_Guest] 
GO 

ALTER TABLE [dbo].[Order_Header] WITH CHECK ADD CONSTRAINT [FK_Order_Header_User] FOREIGN KEY([User_Id]) 
REFERENCES [dbo].[User] ([Id]) 
GO 

ALTER TABLE [dbo].[Order_Header] CHECK CONSTRAINT [FK_Order_Header_User] 
GO 

您可以使用下面的查询,让您的结果

SELECT [dbo].[Order_Header].[Order_No], 
ISNULL([dbo].[User].Id, [dbo].[Guest].id) as 'Id', 
ISNULL([dbo].[User].Email, [dbo].[Guest].Email) as 'Email' 
FROM [dbo].[Order_Header] 
LEFT JOIN [dbo].[User] 
ON [dbo].[Order_Header].User_Id = [dbo].[User].Id 
AND [dbo].[Order_Header].User_Id <> 0 
LEFT JOIN [dbo].[Guest] 
ON [dbo].[Order_Header].Guest_Id = [dbo].[Guest].Id 
AND [dbo].[Order_Header].Guest_Id = 0