繁体   English   中英

非活动记录的 SQL 左连接

[英]SQL left join for inactive records

我有2张桌子。 其中一个有真实的名字,另一个有那些人使用的昵称。

CREATE TABLE [dbo].[Customer](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [firstName] [varchar](50) NULL,
    [lastName] [varchar](50) NULL,
    [active] [bit] NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[CustomerAKA](
    [id] [int] NULL,
    [akaFirstName] [varchar](50) NULL,
    [akaLastName] [varchar](50) NULL
) ON [PRIMARY]
GO
SET IDENTITY_INSERT [dbo].[Customer] ON 

INSERT [dbo].[Customer] ([id], [firstName], [lastName], [active]) VALUES (1, N'Op', N'Test', 0)
INSERT [dbo].[Customer] ([id], [firstName], [lastName], [active]) VALUES (2, N'M', N'J', 1)
INSERT [dbo].[Customer] ([id], [firstName], [lastName], [active]) VALUES (3, N'John', N'Doe', 1)

SET IDENTITY_INSERT [dbo].[Customer] OFF

INSERT [dbo].[CustomerAKA] ([id], [akaFirstName], [akaLastName]) VALUES (1, N'Hello', N'Test')
INSERT [dbo].[CustomerAKA] ([id], [akaFirstName], [akaLastName]) VALUES (1, N'Mahalo', N'Test')
INSERT [dbo].[CustomerAKA] ([id], [akaFirstName], [akaLastName]) VALUES (3, N'Jonny', N'Doe')

我的查询是:

select *
from dbo.Customer c1 
left join dbo.CustomerAKA c2 on c2.id = c1.id
where not exists ( select *
                   from dbo.Customer c
                   where c.id = c1.id
                   and c.active = 0 ) 

即使 Op Test 不活跃,我仍然想为他获得昵称:

1   Hello   Test
1   Mahalo  Test

所以我的输出应该是:

M   J
John    Doe
Jonny   Doe
Hello   Test
Mahalo  Test

有任何想法吗?

不确定你想要什么但看起来像

select *
from dbo.Customer c1
left join dbo.CustomerAKA c2 on c2.id = c1.id
where  c1.active = 1 or (c1.firstname = "Op" and c1.lastname = "Test")
Order by c1.active desc

或者喜欢

select 
coalesce(c2.firstname, c1.firstname) as firstname,
coalesce(c2.lastname, c1.lastname) as lastname
from dbo.Customer c1
Left outer join dbo.CustomerAKA c2 on c2.id = c1.id
Order by c1.active desc

我想你想要union all

select c.firstname, c.lastname
from customer c
union all
select ca.akafirstname, c.akalastname
from customeraka ca join
     customer c
     on ca.id = c.id
where c.active = 1;

尝试这个:

/*
WITH 
  Customer (id, firstName, lastName, active) AS
(
VALUES 
  (1, 'Op', 'Test', 0)
, (2, 'M', 'J', 1)
, (3, 'John', 'Doe', 1)
) 
, CustomerAKA (id, akaFirstName, akaLastName) AS
(
VALUES 
  (1, 'Hello', 'Test')
, (1, 'Mahalo', 'Test')
, (3, 'Jonny', 'Doe')
) 
*/
SELECT firstName, lastName
FROM Customer 
WHERE active = 1
  UNION ALL
SELECT c2.akaFirstName AS firstName, c2.akaLastName AS lastName
FROM CustomerAKA c2
JOIN Customer c1 ON c1.id=c2.id;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM