1

我有以下表格:

  1. 具有 ID 列、描述列和类别父 ID 列的类别表如下:

cat_id | cat_description | cat_pid
--------+------+--------
1 | 状态 | 0
2 | 德州 | 1
3 | 加利福尼亚 | 1
4 | 标题 | 0
5 | 工程师 | 4
6 | 律师 | 4
7 | 农民 | 4
8 | 信用卡 | 0
9 | 签证 | 8
10 | 万事达卡 | 8
...
2. 客户表,客户ID和名称如下:

cust_id | 客户名称
--------+------------ 111111 | 约翰 222222 | 大卫 333333 | 克里斯 444444 | 标记 ...
3. Category_Has_Customer,即客户与类别之间的多对多关系。

chc_cust_id | chc_cat_id
------------+-----------
111111 | 2
111111 | 5
111111 | 9
222222 | 7
222222 | 3
333333 | 6
该类别只有两个级别的深度。

在我的应用程序中,客户可能有零个或多个类别。我想显示客户拥有的部分或全部类别。例如,如果我选择显示所有类别,我希望有下表:

客户名 | 状态 | 标题 | 信用卡
----------+------------+----------+------------
约翰 | 德州 | 工程师 | 签证
大卫 | 加利福尼亚 | 农民 |
克里斯 | | 律师 |
马克 | | |
我还应该能够显示某些类别,例如仅标题和信用卡:

客户名 | 标题 | 信用卡
----------+----------+------------
约翰 | 工程师 | 签证
大卫 | 农民 |
克里斯 | 律师 |
马克 | |

我尝试使用 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

但这并没有帮助,因为我得到了重复的行。

4

1 回答 1

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   

如果您想取出 State,只需将其从 select 语句中删除即可。

于 2011-10-04T23:14:28.810 回答