34,592
社区成员
发帖
与我相关
我的任务
分享
IF EXISTS (SELECT * FROM SYSOBJECTS WHERE NAME = 'tbl_property_codes')
DROP TABLE tbl_property_codes
GO
CREATE TABLE tbl_property_codes --属性代码表
(
id smallint PRIMARY KEY, --索引id
viewid smallint NOT NULL, --视图索引,一个视图就是显示给用户的一个虚拟表,用户可以自定义该表的字段
valtype smallint NOT NULL, --数据类型,int,float, image,text,datatime
name varchar(50) NOT NULL, --属性名称
unit varchar(25) --属性单位
)
IF EXISTS (SELECT * FROM SYSOBJECTS WHERE NAME = 'tbl_data_int')
DROP TABLE tbl_data_int
GO
CREATE TABLE tbl_data_int --存放int数据
(
id int PRIMARY KEY, --索引id
codeid smallint NOT NULL, --属性代码ID
rowid smallint NOT NULL, --行号
val int NOT NULL --数值
)
IF EXISTS (SELECT * FROM SYSOBJECTS WHERE NAME = 'tbl_data_float')
DROP TABLE tbl_data_float
GO
CREATE TABLE tbl_data_float --存放float数据
(
id int PRIMARY KEY, --索引id
codeid smallint NOT NULL, --属性代码ID
rowid smallint NOT NULL, --显示行号
val float NOT NULL --数值
)
IF EXISTS (SELECT * FROM SYSOBJECTS WHERE NAME = 'tbl_data_datetime')
DROP TABLE tbl_data_datetime
GO
CREATE TABLE tbl_data_datetime --存放datetime数据
(
id int PRIMARY KEY, --索引id
codeid smallint NOT NULL, --属性代码ID
rowid smallint NOT NULL, --行号
val datetime NOT NULL --数值
)
IF EXISTS (SELECT * FROM SYSOBJECTS WHERE NAME = 'tbl_data_image')
DROP TABLE tbl_data_image
GO
CREATE TABLE tbl_data_image --存放float数据
(
id int PRIMARY KEY, --索引id
codeid smallint NOT NULL, --属性代码ID
rowid smallint NOT NULL, --行号
val image NOT NULL --数值
)
IF EXISTS (SELECT * FROM SYSOBJECTS WHERE NAME = 'tbl_data_text')
DROP TABLE tbl_data_text
GO
CREATE TABLE tbl_data_text
(
id int PRIMARY KEY, --索引id
codeid smallint NOT NULL, --属性代码ID
rowid smallint NOT NULL, --行号
val nvarchar(x) NOT NULL --数值
)
INSERT INTO tbl_property_codes --建表的时候顺便插的几个记录。
SELECT 1, 0, 3, '中文名称', '' UNION ALL
SELECT 2, 0, 3, '拉丁文名称','' UNION ALL
SELECT 3, 0, 1, '引种号', '' UNION ALL
SELECT 4, 0, 3, '原产地', ''
--插几个样本数据。
INSERT INTO tbl_data_text (id,codeid,rowid,val) VALUES (1,1,1,'小黄鸟鹤蕉')
INSERT INTO tbl_data_text (id,codeid,rowid,val) VALUES (2,2,1,'Heliconia acuminata cv. Yellow Waltz')
INSERT INTO tbl_data_int (id,codeid,rowid,val) VALUES (1,3,1,10000)
INSERT INTO tbl_data_text (id,codeid,rowid,val) VALUES (3,4,1,'巴西或夏威夷')
--查询大概思路,在查询的时候知道当前虚拟表的所有字段id如下面的1,2,3,4,SQL可以让程序生成。但个人觉得虽然可以实现,但是感觉比较笨重。有没有好一点的办法?
SELECT t1.val AS '中文名称',t2.val AS '拉丁文名称',t3.val AS '引种号',t4.val AS '原产地'
FROM
(SELECT id,codeid,rowid,val FROM tbl_data_text WHERE codeid=1) AS t1,
(SELECT id,codeid,rowid,val FROM tbl_data_text WHERE codeid=2) AS t2,
(SELECT id,codeid,rowid,val FROM tbl_data_int WHERE codeid=3) AS t3,
(SELECT id,codeid,rowid,val FROM tbl_data_text WHERE codeid=4) AS t4
WHERE t1.rowid = t2.rowid AND t2.rowid=t3.rowid AND t3.rowid=t4.rowid
1.字段型设成可变长度的 nvarchar类型...
2.查询时用 join on 条件一and 条件二...