这样的数据怎么存储更好?

chengulv 2018-01-22 09:11:07
每次可提交6个数字。 如: 1,2,3,4,5,6

想把他们相互关联起来,随便找期中的一个数字 都能和它一起出现过的其他全部数字。

如 搜索2、 出来的结果是 1、3、4、5、6
搜索3、 出来的结果是 1、2、4、5、6

MSSQL中 这样的表,如何设计,如何添加保存比较好?

我是想设计三个字段 A、B、addTime

1,2, 2018-1-22
1,3, 2018-1-22
1,4, 2018-1-22
1,5, 2018-1-22
1,6, 2018-1-22
2,3, 2018-1-22
2,4, 2018-1-22
2,5, 2018-1-22
2,6, 2018-1-22
3,4, 2018-1-22
3,5, 2018-1-22
......

但这样在存储过程中要如何把数据添加进去呢? 用循环太慢了吧。 有没有其它什么好办法?
...全文
1384 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ChinaITOldMan 2018-02-07
  • 打赏
  • 举报
回复
引用 3 楼 yenange 的回复:
USE tempdb
GO
IF OBJECT_ID('t') IS NOT NULL DROP TABLE t
GO
--优点:效率高,占用空间小,一目了然
CREATE TABLE t(
	searchNum INT,
	startNum INT,
	endNum INT,
	addTime DATETIME DEFAULT(GETDATE())	
)
ALTER TABLE t ADD CONSTRAINT ck_t_searchNum CHECK ( searchNum BETWEEN startNum AND endNum )

INSERT INTO t (searchNum,startNum,endNum) VALUES (2,1,6)
INSERT INTO t (searchNum,startNum,endNum) VALUES (3,1,6)
INSERT INTO t (searchNum,startNum,endNum) VALUES (5,2,10)

SELECT 
	searchNum
	,startNum
	,endNum
	,STUFF( 
		(SELECT ','+CAST(sv.number AS VARCHAR(10)) 
			FROM [master].dbo.spt_values AS sv 
			WHERE sv.[type]='P' AND sv.number BETWEEN t.startNum 
				AND t.endNum AND sv.number!=t.searchNum FOR XML PATH(''))
		,1,1,'') AS result
	,addTime
FROM t
/*
searchNum	startNum	endNum	result				addTime
2			1				6	1,3,4,5,6			2018-01-23 08:25:07.933
3			1				6	1,2,4,5,6			2018-01-23 08:25:07.933
5			2				10	2,3,4,6,7,8,9,10	2018-01-23 08:25:07.933
*/
很不多,值得推荐学习
日月路明 2018-01-31
  • 打赏
  • 举报
回复
为什么不采用#01的设计方案?
jack66wong 2018-01-31
  • 打赏
  • 举报
回复
学习一下。。。。。。。。。。。。。。
xiaoxiangqing 2018-01-23
  • 打赏
  • 举报
回复
最好保存为子表
吉普赛的歌 2018-01-23
  • 打赏
  • 举报
回复
USE tempdb
GO
IF OBJECT_ID('t') IS NOT NULL DROP TABLE t
GO
--优点:效率高,占用空间小,一目了然
CREATE TABLE t(
	searchNum INT,
	startNum INT,
	endNum INT,
	addTime DATETIME DEFAULT(GETDATE())	
)
ALTER TABLE t ADD CONSTRAINT ck_t_searchNum CHECK ( searchNum BETWEEN startNum AND endNum )

INSERT INTO t (searchNum,startNum,endNum) VALUES (2,1,6)
INSERT INTO t (searchNum,startNum,endNum) VALUES (3,1,6)
INSERT INTO t (searchNum,startNum,endNum) VALUES (5,2,10)

SELECT 
	searchNum
	,startNum
	,endNum
	,STUFF( 
		(SELECT ','+CAST(sv.number AS VARCHAR(10)) 
			FROM [master].dbo.spt_values AS sv 
			WHERE sv.[type]='P' AND sv.number BETWEEN t.startNum 
				AND t.endNum AND sv.number!=t.searchNum FOR XML PATH(''))
		,1,1,'') AS result
	,addTime
FROM t
/*
searchNum	startNum	endNum	result				addTime
2			1				6	1,3,4,5,6			2018-01-23 08:25:07.933
3			1				6	1,2,4,5,6			2018-01-23 08:25:07.933
5			2				10	2,3,4,6,7,8,9,10	2018-01-23 08:25:07.933
*/
卖水果的net 2018-01-23
  • 打赏
  • 举报
回复
楼主这样的设计挺好,也是常见的设计模式。
中国风 2018-01-23
  • 打赏
  • 举报
回复
设计每两个表记录,LOT批次,每次提交的数量和时间 ,LotItem明细表每次提交的数字
LOT
ID Counted CreateDate
1  6        2018-01-22
2	6	 2018-01-22

LotItem
ID LotID Num
1 1	     1
2 1		 2
3 1		3
......
7  2    1

二月十六 2018-01-22
  • 打赏
  • 举报
回复
str addTime 1,2,3,4,5,6 2018-1-22 获取的时候用charindex

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧