SQL Server:从父表中选择,其中任何子表中都不存在id

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)

Mur*_*nik 5

使用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)