iT邦幫忙

0

樹狀資料,如何查詢出底下零件可組成之數量?

  • 分享至 

  • xImage

目前是從1開始跑
一個個比對
跑到目標數量
但是速度非常慢
有沒有更好寫法呢?

底下是目前寫法+測試資料
"pro" 資料表是存放"料號","庫存量"
"relate" 資料表是存放樹狀資料和組成數量


CREATE TABLE relate(
	id nvarchar(20),
	parentid nvarchar(20),
	mount int
);

CREATE TABLE pro(
	id nvarchar(20),
	stock int
	
);

INSERT INTO relate (id,parentid,mount)
VALUES ('1-1', '1',1),('1-2', '1',1),('1-3', '1',1)

INSERT INTO pro (id,stock)
VALUES ('1-1',1500),('1-2',11793),('1-3',1934)


CREATE FUNCTION vr_stock(@pno as nvarchar(20))
RETURNS nvarchar(20)
BEGIN
	declare @count int
	set @count = 1

		WHILE NOT EXISTS(
				select a.Id,a.ParentId,a.mount,b.stock
				from relate a
				left join pro b on a.Id = b.id
				where a.parentid = @pno
				and (a.mount * @count) > b.stock
			)
		BEGIN

			SET @count = @count + 1
		END

	RETURN @count - 1
END

select dbo.vr_stock('1')
會出現答案1500
但資料多速度會很慢

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

0
一級屠豬士
iT邦大師 1 級 ‧ 2022-02-18 10:09:54
最佳解答

使用PG 跑了個測試

CREATE TABLE relate(
	id varchar(5),
	parentid varchar(5),
	mount int
);

CREATE TABLE pro(
	id varchar(5),
	stock int
);

INSERT INTO relate (id,parentid,mount)
VALUES ('1-1', '1',1),('1-2', '1',1),('1-3', '1',1);

INSERT INTO pro (id,stock)
VALUES ('1-1',1500),('1-2',11793),('1-3',1934);

with t1 as (
select a.Id,a.ParentId,a.mount,b.stock, floor(b.stock  / a.mount) as "prod"
  from relate a 
  left join pro b on a.Id = b.id
 where a.parentid = '1'
)
select min(prod)
  from t1;
 
min
----
1500

修改成用 floor() !

s34631327 iT邦新手 5 級 ‧ 2022-02-18 13:09:37 檢舉

感謝,我試試看

s34631327 iT邦新手 5 級 ‧ 2022-02-21 10:08:51 檢舉

但如是希望一次計算出多個,像是這樣
select dbo.vr_stock(pno) from orde
有辦法嗎?
自訂"純量值函數"好像無法用CTE

你把你的資料跟想要達到的設法展現出來,也許另外發一篇會比較清楚.
另外不用糾結什麼 自訂"純量值函數", 那是你建立函數的,處理問題
就不要糾結在一些點上,影響整體實際目標.

0
dscwferp
iT邦高手 1 級 ‧ 2022-02-17 18:02:48
s34631327 iT邦新手 5 級 ‧ 2022-02-18 13:09:01 檢舉

感謝,我再研究看看

我要發表回答

立即登入回答