INSERT语句填写缺失的行

时间:2014-04-13 11:19:14

标签: sql sql-server tsql

我有一个客户列表和一些需要与每个客户关联的模板。我尝试做的是确保每个缺少模板的客户都插入了这些模板,但是我在编写一份声明时难以确定哪些客户的模板丢失了。

在下面的数据集中,我有5个客户和3个模板。我怎样才能找到丢失的模板来实现最底层的数据集?

Customers
CustID, Name
C001, John
C002, Jack
C003, Jim
C004, Jill
C005, Julie
-------------------------------

Templates
CustID, TemplateID
C001, T001
C001, T002
C001, T003
C002, T001
C002, T002
C002, T003
C003, T001
C003, T003
C004, T003
-------------------------------

Templates
CustID, TemplateID
C001, T001
C001, T002
C001, T003
C002, T001
C002, T002
C002, T003
C003, T001
C003, T002
C003, T003
C004, T001
C004, T002
C004, T003
C005, T001
C005, T002
C005, T003


----

我不希望整个插入语句,但如果你能帮我弄清楚如何找到我们会很棒的缺失行。

4 个答案:

答案 0 :(得分:0)

加入+除外。 SQLFiddle

-- Now you can see how it works in 2012!
CREATE TABLE Customers (
     CustID varchar(6) primary key, 
     Name varchar(20) 
);

INSERT INTO Customers VALUES
('C001', 'John'),
('C002', 'Jack'),
('C003', 'Jim'),
('C004', 'Jill'),
('C005', 'Julie');

CREATE TABLE TemplatesID 
    (
     TemplateID varchar(6) primary key 
    );

INSERT INTO TemplatesID

VALUES ('T001'),('T002'),('T003');


CREATE TABLE Templates (
  TemplateID varchar(6) ,
  CustID varchar(6)
);

INSERT INTO Templates
VALUES
('T001','C001'),
('T001', 'C002');

查询

select TemplateID,CustID from Customers join TemplatesID on 1!=0 
EXCEPT
select TemplateID,CustID from Templates

答案 1 :(得分:0)

因此,首先列出所有可能的模板和客户组合..

Select Customers.CustId, AllTemplates.TemplateId
From AllTemplates
CROSS JOIN Customers

然后使用左连接将您当前的列表与所有可能组合的列表进行比较,并且在左连接中您获得NULL的任何位置都找到了丢失的模板!

With AllPossibleCustomerTemplate as (
    Select Customers.CustId, Templates.TemplateId
    From Templates
    CROSS JOIN Customers
)
Select AllPossibleCustomerTemplates.CustId as MissingCustId,
       AllPossibleCustomerTemplates.TemplateId as MissingTemplateId
from AllPossibleCustomerTemplates 
left join ExistingCustomerTemplates ect ON ect.CustId = AllPossibleCustomerTemplates.CustId
                                        AND ect.TemplateId = AllPossibleCustomerTemplates.TemplateId
WHERE ect.CustId is null

答案 2 :(得分:0)

尝试此查询我的朋友:

with 
t1 as (select distinct TemplateID from Templates),
t2 as (select distinct CustID from Customers),
t3 as (select t2.*,t1.* from t2,t1),
t4 as (select * from t3 where
CustID+TemplateID not in 
(select CustID+TemplateID from Templates))
insert into Templates select * from t4;

SQL Fiddle

答案 3 :(得分:0)

with cte1 as
(
    select
        c.CustID, t.TemplateID
    from
        Customers c
    cross join
        (select distinct TemplateID from Templates) t
),
cte2 as
(
    select
        *
    from
        cte1
    where
        CustID + TemplateID not in(select CustID + TemplateID from Templates)
)

insert into Templates select * from cte2

select * from Templates order by CustID, TemplateID