我有一个客户列表和一些需要与每个客户关联的模板。我尝试做的是确保每个缺少模板的客户都插入了这些模板,但是我在编写一份声明时难以确定哪些客户的模板丢失了。
在下面的数据集中,我有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
----
我不希望整个插入语句,但如果你能帮我弄清楚如何找到我们会很棒的缺失行。
答案 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;
答案 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