1

次のテーブルがあります。

  1. 次のように、ID 列、説明列、およびカテゴリの親 ID 列を持つカテゴリ テーブル:

cat_id | 猫の説明 | cat_pid
-------+-----------------+--------
1 | 状態 | 0
2 | テキサス | テキサス | 1
3 | カリフォルニア | 1
4 | タイトル | 0
5 | エンジニア | 4
6 | 弁護士 | 4
7 | ファーマー | ファーマー 4
8 | クレジットカード | 0
9 | ビザ | 8
10 | マスターカード | 8
...
2. 次のような顧客 ID と名前を持つ Customer テーブル:

cust_id | cust_name
--------+----------- 111111 | ジョン 222222 | デビッド 333333 | クリス 444444 | マーク ...
3. Customer と Category の間の多対多の関係である Category_Has_Customer。

chc_cust_id | chc_cat_id
------------+-----------
111111 | 2
111111 | 5
111111 | 9
222222 | 7
222222 | 3
333333 | 6
カテゴリの深さは 2 レベルのみです。

私のアプリケーションでは、顧客は 0 個以上のカテゴリを持つことができました。顧客が持っているカテゴリの一部またはすべてを表示したいと考えています。たとえば、すべてのカテゴリを表示することを選択した場合、次のテーブルが必要です。

顧客名 | 状態 | タイトル | クレジットカード
----------+------------+----------+------------
ジョン | ジョン | テキサス | テキサス | エンジニア | ビザ
デビッド | カリフォルニア | ファーマー | ファーマー
クリス | | | 弁護士 |
マーク | | | | |
タイトルとクレジット カードのみなど、特定のカテゴリも表示できるはずです。

顧客名 | タイトル | クレジットカード
----------+---------+------------
ジョン | ジョン | エンジニア | ビザ
デビッド | ファーマー | ファーマー
クリス | 弁護士 |
マーク | | |

私は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 に答える