iT邦幫忙

0

同群組,藉由群組任意料號,找到該群組所有料號

  • 分享至 

  • xImage

https://ithelp.ithome.com.tw/upload/images/20231213/20127967xGTI0O5ysG.jpg

如上圖

紅框和綠框分別為兩個群組

希望輸入某料號找到該群組所有料號

*一個料號只會有一個群組
*料號會對應該群組"任意料號"

測試資料

`
CREATE TABLE #a(
pno nvarchar(20),
pro nvarchar(20)
);

insert into #a
select '10000-00072-10','10000-00072-01'
insert into #a
select '10000-00072-02','10000-00072-07'
insert into #a
select '10000-00072-08','10000-00072-01'
insert into #a
select '10000-00072-07','10000-00072-08'
insert into #a
select '10000-00072-05','10000-00072-01'
insert into #a
select '10000-00072-09','10000-00072-03'
insert into #a
select '10000-00072-06','10000-00072-03'
insert into #a
select '10000-00072-04','10000-00072-03'`



https://ithelp.ithome.com.tw/upload/images/20231213/20127967ElxSK4ZNXs.jpg

上圖設計方式較簡單

但因產品長度,半徑...規格不同

導致命名群組名稱會有困難

目前不考慮這方式

或是說只能用這方法

希望可以聽聽前輩們想法

看更多先前的討論...收起先前的討論...
亂皮皮 iT邦新手 2 級 ‧ 2023-12-13 11:57:50 檢舉
依照你的測試資料 看不出來分類的原則,如果依照你上圖的群組名稱就可以輸入一個貨號秀出同組的料號
s34631327 iT邦新手 5 級 ‧ 2023-12-13 12:04:11 檢舉
表中10000-00072-10和10000-00072-01有關聯,
10000-00072-05和10000-00072-01有關聯,
則10000-00072-10和10000-00072-05也會有關聯,算是同群
不太明白這樣分要幹嘛
料號有料號編碼原則
如果要分群組,原則上在編碼上面就要寫進去,這是在資料表欄位已經固定無法新增的時候
大家都是這麼做的
如果資料庫是自己設計的,那就是加入群組欄位,
你說群組名稱很難命名,最簡單的方式就是開一個群組名稱對照表,
用群組ID 當 紀錄在 每個料號的某個欄位內,這樣每一個群組都能定義名稱與說明,這樣就能一清二楚了
跟??窮嘶?????同樣意見,資料表新增群組欄位,要查詢時就能用群組去查,以及開群組資料表設定你要的紅.藍,用join的方式就能組出
我在猜測,原始的命名結構是不是TREE,然後上述的EXCEL表記錄的「群組」是父節點?如果要找出群組成員,那就是TREE要跑一次?
s34631327 iT邦新手 5 級 ‧ 2023-12-21 08:44:24 檢舉
很像樹狀,但不是,原始的資料結構,就是excel那樣子儲存
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

0
亂皮皮
iT邦新手 2 級 ‧ 2023-12-13 15:38:23
最佳解答

我認為上面的方式比較好,做一個對應表,硬要做到你想的那樣也是可以,只是很奇怪

declare @a table(
pno nvarchar(20),
pro nvarchar(20)
);
declare @b table(
keyword nvarchar(20)
);
declare @c table(
keyword nvarchar(20)
);

insert into @a
values( '10000-00072-10','10000-00072-01'),
	( '10000-00072-02','10000-00072-07'),
	( '10000-00072-08','10000-00072-01'),
	( '10000-00072-07','10000-00072-08'),
	( '10000-00072-05','10000-00072-01'),
	( '10000-00072-09','10000-00072-03'),
	( '10000-00072-06','10000-00072-03'),
	( '10000-00072-04','10000-00072-03')

DECLARE @InputKey as NVARCHAR(20)

set  @InputKey ='10000-00072-03' ;

insert into @c
values (@InputKey)

WHILE (SELECT count(keyword) from @c) >= 1  
BEGIN  
	insert into @b
	select keyword from @c

	delete from @c

	insert into @c
	select pro as keyword from (
	select pro from @a
	inner join @b on keyword = pno
	union 
	select pno from @a
	inner join @b on keyword = pro
	) as a where a.pro not in (select keyword from @b)	
END

Select pno,pro from @a 
inner join @b on keyword = pro
s34631327 iT邦新手 5 級 ‧ 2023-12-14 11:33:45 檢舉

感謝 我研究下

0
alien663
iT邦研究生 3 級 ‧ 2023-12-13 13:47:37
CREATE TABLE #a(
    AID int,
    pno nvarchar(20),
    pro nvarchar(20),
    BID int,
);

create table #b(
    BID int,
)

insert into #a(AID, PNO, BID)
    values
        (1, '10000-00072-10', 1),
        (2, '10000-00072-01', 1),
        (3, '10000-00072-08', 1),
        (4, '10000-00072-05', 1),
        (5, '10000-00072-07', 1),
        (6, '10000-00072-02', 1),
        (7, '10000-00072-09', 2),
        (8, '10000-00072-06', 2),
        (9, '10000-00072-04', 2),
        (10, '10000-00072-03', 2)

insert into #b(BID)
    values (1), (2)


select * from #a A1
	inner join #b B on A1.BID = B.BID
	inner join #a A2 on B.BID = A2.BID
where A1.PNO = '10000-00072-10'

我要發表回答

立即登入回答