我有以下表格:
cat_id | cat_description | cat_pid -------+-----------------+-------- 1 | State | 0 2 | Texas | 1 3 | California | 1 4 | Title | 0 5 | Engineer | 4 6 | Lawyer | 4 7 | Farmer | 4 8 | Credit Card | 0 9 | Visa | 8 10 | Master Card | 8 ...2.客户表,其客户ID和名称如下:
cust_id | cust_name3. Category_Has_Customer,它是Customer和Category之间的多对多关系。
--------+----------- 111111 | John 222222 | David 333333 | Chris 444444 | Mark ...
chc_cust_id | chc_cat_id ------------+----------- 111111 | 2 111111 | 5 111111 | 9 222222 | 7 222222 | 3 333333 | 6该类别只有两个级别深度。
在我的应用程序中,客户可以拥有零个或多个类别。我想显示客户拥有的部分或全部类别。例如,如果我选择显示所有类别,我想拥有下表:
cust_name | State | Title | Credit Card ----------+------------+----------+------------ John | Texas | Engineer | Visa David | California | Farmer | Chris | | Lawyer | Mark | | |我还应该能够显示某些类别,例如标题和信用卡:
cust_name | Title | Credit Card ----------+----------+------------ John | Engineer | Visa David | Farmer | Chris | Lawyer | Mark | |
我尝试用LEFT JOIN做的,比如:
SELECT c1.cust_id, c1.cust_name, t1.cat_desc as State
FROM Customer c1, Category_has_Customer chc
LEFT JOIN Category t1 ON t1.cat_pid = '1' AND chc.chc_cat_id = t1.cat_id
WHERE c1.cust_id = chc.chc_cust_id
但是由于我得到了重复的行,所以没有用。
提前感谢您的帮助
答案 0 :(得分:0)
我会放弃一下,应该对所有sql实现工作,但我已经在t-sql中完成了:
使用此数据
declare @Category table (cat_id int, cat_description varchar(20), cat_pid int)
declare @Customer table (cust_id int, cust_name varchar(20))
declare @Customer_Has_Category table (chc_cust_id int, chc_cat_id int)
insert into @Category (cat_id, cat_description, cat_pid) values (1,'State',0)
insert into @Category (cat_id, cat_description, cat_pid) values (2,'Texas',1)
insert into @Category (cat_id, cat_description, cat_pid) values (3,'California',1)
insert into @Category (cat_id, cat_description, cat_pid) values (4,'Title',0)
insert into @Category (cat_id, cat_description, cat_pid) values (5,'Engineer',4)
insert into @Category (cat_id, cat_description, cat_pid) values (6,'Lawyer',4)
insert into @Category (cat_id, cat_description, cat_pid) values (7,'Farmer',4)
insert into @Category (cat_id, cat_description, cat_pid) values (8,'Credit Card',0)
insert into @Category (cat_id, cat_description, cat_pid) values (9,'Visa',8)
insert into @Category (cat_id, cat_description, cat_pid) values (10,'Master Card',8)
insert into @Customer (cust_id, cust_name) values (111111, 'John')
insert into @Customer (cust_id, cust_name) values (222222, 'David')
insert into @Customer (cust_id, cust_name) values (333333, 'Chris')
insert into @Customer (cust_id, cust_name) values (444444, 'Mark')
insert into @Customer_Has_Category (chc_cust_id, chc_cat_id) values (111111, 2)
insert into @Customer_Has_Category (chc_cust_id, chc_cat_id) values (111111, 5)
insert into @Customer_Has_Category (chc_cust_id, chc_cat_id) values (111111, 9)
insert into @Customer_Has_Category (chc_cust_id, chc_cat_id) values (222222, 7)
insert into @Customer_Has_Category (chc_cust_id, chc_cat_id) values (222222, 3)
insert into @Customer_Has_Category (chc_cust_id, chc_cat_id) values (333333, 6)
此查询
select cust_name, MAX(State) as State, MAX(Title) as Title, MAX(CreditCard) as CreditCard
from
(
select
c.cust_name,
(case when cat.cat_pid = 1 then cat_description else '' end) as State,
(case when cat.cat_pid = 4 then cat_description else '' end) as Title,
(case when cat.cat_pid = 8 then cat_description else '' end) as CreditCard
from @Customer c
left outer join @Customer_Has_Category chc on c.cust_id = chc.chc_cust_id
left outer join @Category cat on chc.chc_cat_id = cat.cat_id
) as subq
group by cust_name
给出
cust_name State Title CreditCard
-------------------- -------------------- -------------------- --------------------
Chris Lawyer
David California Farmer
John Texas Engineer Visa
Mark
如果你想取出状态,只需从select语句中删除它。