2017-04-24 61 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