bru*_*iow 4 sql t-sql sql-server join
我需要从customer表中选择所有行,它们在调用表中没有行,并且在调用存档表中没有行.看起来很简单,但我已经把自己包裹起来试图让查询运行.
所以表的结构如下:customer
是父,调用和调用存档都链接到customer_id
.
请有人帮帮我吧!
CREATE TABLE [dbo].[customer]
(
[customer_Id] [varchar](50) NOT NULL
CONSTRAINT [PK_customer]
PRIMARY KEY CLUSTERED ([customer_Id] ASC)
)
CREATE TABLE [dbo].[call]
(
[call_Id] [int] NOT NULL,
[customer_Id] [int] NULL,
[call_description] [varchar](50) NULL,
CONSTRAINT [PK_call]
PRIMARY KEY CLUSTERED ([call_Id] ASC)
)
ALTER TABLE [dbo].[call] WITH CHECK
ADD CONSTRAINT [FK_call_customer]
FOREIGN KEY([customerKey]) REFERENCES [dbo].[customer] ([customerkey])
GO
CREATE TABLE [dbo].[callArchive]
(
[call_Id] [int] NOT NULL,
[customer_Id] [int] NULL,
[call_description] [varchar](50) NULL,
CONSTRAINT [PK_call]
PRIMARY KEY CLUSTERED ([call_Id] ASC)
)
ALTER TABLE [dbo].[call] WITH CHECK
ADD CONSTRAINT [FK_call_customer]
FOREIGN KEY([customerKey]) REFERENCES [dbo].[customer] ([customerkey])
GO
Run Code Online (Sandbox Code Playgroud)
我尝试call_id
使用左外连接对列进行选择计数,但是我在那里得到的记录是我不希望看到的:
SELECT
COUNT(call.Call_id) AS Calls,
COUNT(callArchive.Call_id) AS Archive_Calls
FROM
customer
LEFT OUTER JOIN
call ON customer.customer_id = call.customer_id
LEFT OUTER JOIN
callArchive ON customer.customer_id = callArchive.customer_id
HAVING
((COUNT(callArchive.Call_id) = 0)
AND (COUNT(call.Call_id) = 0))
ORDER BY
customer.customer_dateAdded DESC
Run Code Online (Sandbox Code Playgroud)
使用not exists
运算符的方法更简单,而不是用连接来解决问题:
SELECT *
FROM [customer] c
WHERE NOT EXISTS (SELECT *
FROM [call]
WHERE [call].customer_id = c.customer_id) AND
NOT EXISTS (SELECT *
FROM [callArchive]
WHERE [callArchive].customer_id = c.customer_id)
Run Code Online (Sandbox Code Playgroud)