求助查询问题

[复制链接]
查看11 | 回复7 | 2005-4-10 01:02:10 | 显示全部楼层 |阅读模式
有这样一个表tb1(product,unit,xh*)
有6行数据
xh*
product unit
1 0001001
2 0001002
3 0001003
4 0002001
5 0003001
6 0003003
可以看出:
product0001由unit001,002,003组成;
product0002由unit001组成;
product0003由unit001,003组成。
如果现在已知unit由001,003两个部件构成,如何查询出唯一的product0003?
如果只输入unit001,如何只查询出product0002.(product0001,product0003不被检索出来)
-----------------------------------------------------------------------------------------------
CREATE TABLE [dbo].[tb1] (

[product] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,

[unit] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,

[xh] [int] IDENTITY (1, 1) NOT NULL
) ON [PRIMARY]
INSERT INTO tb1
(PRODUCT,UNIT)
VALUES ('0001','001')
INSERT INTO tb1
(PRODUCT,UNIT)
VALUES ('0001','002')
INSERT INTO tb1
(PRODUCT,UNIT)
VALUES ('0001','003')
INSERT INTO tb1
(PRODUCT,UNIT)
VALUES ('0002','001')
INSERT INTO tb1
(PRODUCT,UNIT)
VALUES ('0003','001')
INSERT INTO tb1
(PRODUCT,UNIT)
VALUES ('0003','003')
---------------------------------------------------------------------------------
回复

使用道具 举报

千问 | 2005-4-10 01:02:10 | 显示全部楼层
不清楚,支持一下
回复

使用道具 举报

千问 | 2005-4-10 01:02:10 | 显示全部楼层
查詢時, 檢查一下當參數只有一個時, 採用02, 二個時, 得到03, 三個時, 得到01, 但如果某一個項有很多數據, 你的數據表設計就有問題了, 你總不可能檢查更多的參數輸入啊.
不知閣下可否透露一下, 你的設計初衷是為了解決什麼問題.
回复

使用道具 举报

千问 | 2005-4-10 01:02:10 | 显示全部楼层
我觉得这样设计表,确实有点奇怪。
回复

使用道具 举报

千问 | 2005-4-10 01:02:10 | 显示全部楼层
这张表是别人设计的。
当初的查询只有根据product查unit
现在突然需要我做一个从unit查product的程序。
也就是说,选择unit,查询是否有满足条件的product。
请问各位大虾,如何设计新的表结构来满足需求。
回复

使用道具 举报

千问 | 2005-4-10 01:02:10 | 显示全部楼层
你的入口參數應該定下來, 而且我覺得你的查詢結果很奇怪.
因為如果你查詢 unit = 001 和 unit = 003 的時候, 肯定會得到 0001 和 0003 兩個 product, 這是正常的, 而且也是符合實際需求, 如果硬是按你的想法去查詢的話, 你在查詢時這樣做看行不行.
1. 首先確定入口參數.
將所有的unit 按升序連接起來, 一般用255個字符就夠了, 一般軟件設計的 unit 單位都在3~4個
字符, 例如
@unit = ltrim(rtrim(@bunit))+','+'trim(rtrim(@eunit))
2. select [product], [unit] = convert(nvarchar(255), '') into [#tmp_table] from [table] where 1=0
declare [cursor_tmp_table] cursor for select [product], [unit] from [table] group by [procut], [unit] order by [product], [unit]
open [cursor_tmp_table]
fetch next from [cursor_tmp_table] into @product, @unit
while @@fetch_status-1
回复

使用道具 举报

千问 | 2005-4-10 01:02:10 | 显示全部楼层
begin
if exists(select [product] from [#tmp_table] where [product] = @product)
update [#tmp_table] set [unit] = ltrim(rtrim([unit])) + ',' + ltrim(rtrim(@unit))
else
insert [#tmp_table] values(@product, ltrim(rtrim(@unit)))
fetch next from [cursor_tmp_table] into @product, @unit
end
close [cursor_tmp_table]
deallocate [cursor_tmp_table]
select * from [#tmp_table] where [unit] = @unit
結果就是你要的 product
回复

使用道具 举报

千问 | 2005-4-10 01:02:10 | 显示全部楼层
我刚看过MRP中的物料清单的定义,wanglue兄的这个表应该和物料清单的意思差不多吧。如果这样的话,product和unitj 是一种树型结构了,从根结点查询子结点很容易,现在是要从子结点来确认惟一包括它的父结点吗?
可以这样,先用子结点查询出拥有它的所有父结点,再判断父结点的下的子结点个数与查询条件的个数是否一样,比如0002有001一个子结点,003有001、003两个。如果我们有001一查询则有0001、0002、0003,依次判断,只有0002子结点和条件个数一样,所以结果就是0002.
思路如此,不知可以吗?代码我写不出,不好意思。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行