2017-04-24 3 views
0

Ich versuche, 3 Tabellen beizutreten.Bedingte innere Verknüpfung in SQL Server mit CASE

Meine erste Tabelle ist Order_Header mit Primärschlüssel Id und zwei Fremdschlüssel User_Id zu User Tisch und Guest_Id-Guest Tisch.

Wenn in Order_Header Tabelle der Wert für Guest_Id 0 ist, möchte ich eine inner join mit dem User Tabelle zu tun, und wenn der Wert für User_Id 0 ist, möchte ich join mit dem Guest Tisch.

Wie kann ich das erreichen?

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

Es ist im Allgemeinen besser kennen zu verwenden und/oder anstelle von Fall Ausdrücke in WHERE und ON-Klauseln. – jarlh

+2

Fügen Sie einige Beispieltabellendaten und das erwartete Ergebnis hinzu - auch formatierten Text. – jarlh

Antwort

-1

Sie können diesen Code versuchen:

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

Try CASE in Auswahl zu verwenden, nicht in einem Zustand:

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

Ihre Anfrage ist fast richtig, du bist nur ein paar fehlt coalesce in select anstelle von where Klausel (die syntaktisch falsch ist)

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 

diese Weise können Sie nur eine ID Spalte und eine Email Spalte haben, die jeweils mit den Werten ausgefüllt von User wenn verfügbar, oder von Guest anders.

0

die folgende Tabelle Unter Berücksichtigung Definitionen

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 

Sie die folgende Abfrage verwenden, können Sie Ihre Ergebnisse

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