显示单个条目的多个类别

时间:2011-10-04 22:35:13

标签: sql tsql cross-join derived-table

我有以下表格:

  1. 具有ID列,描述列和类别父ID列的类别表,如下所示:
  2. 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_name
    --------+----------- 111111 | John 222222 | David 333333 | Chris 444444 | Mark ...
    3. Category_Has_Customer,它是Customer和Category之间的多对多关系。

    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
    

    但是由于我得到了重复的行,所以没有用。

    提前感谢您的帮助

1 个答案:

答案 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语句中删除它。