一个400积分的问题?请sql高手回答?谢谢谢谢(200分)

  • 主题发起人 主题发起人 xingeydh
  • 开始时间 开始时间
X

xingeydh

Unregistered / Unconfirmed
GUEST, unregistred user!
我想在一个sourcetable 表中,添加记录后,自动的成为另一张表objecttable的字段,我知道用触发器来
做,可是我不会编写这个触发器的程序,而且即使添加相同的记录,通过触发器后,相同的记录
作为一个字段出现在另一张表中,请高手写出此程序,拜托诸位 sql 大侠????!!
 
还不如在客户端用 TFieldDefs 实现来的方便。
 
同意bakubaku
 
同意bakubaku
 
实现的功能很简单,但如果一定要用触发器的话就没那么简单了,不如在程序中通过SQL
来实现:
假设Table1添加记录,用Query1来添加字段
在Table1的onInsert事件中写如下语句:
procedure TForm1.Table1AfterInsert(DataSet: TDataSet);
begin
try
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('ALTER TABLE objecttable ADD '+
Table1.FieldByName('yourfieldname').AsString+' VARCHAR(20) NULL');
Query1.ExecSQL;
except
showmessage('字段'''+table1.FieldByName('yourfieldname').AsString+
'''已经存在!')
end;
end;
这样不也同样可以达到相同的效果吗?
所以说,当一条路走不通的时候就想想用别的方法,只要可以解决问题,谁还管你用的
什么方法呀。
 
为什么要实现这样奇怪的功能呢?
 
在SQL服务器上持行,以后表会自动更新!
用触发器
CREATE TRIGGER 触发器名
ON sourcetable
FOR insert
AS
BEGIN
INSERT objecttable(新表的
字段名1,
字段名2
。。。。。)
select (旧表的
字段名1,
字段名2
。。。。。)

FROM sourcetable
END
GO
 
楼上的兄弟都说了,我已经是没意见了。
就照着干吧!
 
闪电:
您真厉害!以后多关照小弟:)
 
CREATE TRIGGER 触发器名
ON sourcetable
FOR insert
AS
BEGIN
INSERT into objecttable select * from inserted
END
 
其中INSERTED 是系统提供存储插入数据的临时表
 
是什么数据库?
你是指一行数据成为另外一个表的一列?还是一行成为另外的表的也是一行?

如果是指一行数据成为另外一个表的一列
如果是oracle8,则使用自定义的结构类型的列。
如果是其他数据库,我不知道。
 
要存成一个字段,那你的字段应该是CHAR类型的,可以用下面的转化
INSERT into objecttable select convert(...)+convert... from inserted
其实你又为何一定要是一个字段呢,用多个字段不是很好吗,以后用的时候不用
在分解
 
To 闪电、mataijin :
你们都没有看懂 xingeydh 的原意!
这个问题当然用 Trigger 也能做,但是很复杂。需要动态在 Trigger 中拼接 Alter Table
SQL 语句,再 Execute 这个拼接出来的命令。
btw: xingeydh 的要求很奇怪,这样的程序除非有非常特别的应用,否则决不应该采用这样
的做法。我猜想一般可能是 Cross Table 的要求,字典表的每一项成为查询结果的一列,在
Access 和 PB 中就能够实现 Cross Table ,比如在 Access 中:

V_Score: 成绩表
学号 姓名 分数 课程编码 课程名称(根据课程编码与课程字典表连接查询得到)
Student_Code Student_Name Score Lesson_Code Lesson_Name ...

下面就是 Cross Table 的 SQL 语句:

TRANSFORM Last([V_Score].[Score]) AS Score
SELECT [V_Score].[Student_Code], [V_Score].[Student_Name]
FROM V_Score
GROUP BY [V_Score].[Student_Code], [V_Score].[Student_Name], [V_Score].[Region_Code], [V_Score].[Region_Name], [V_Score].[Sex], [V_Score].[Birthday], [V_Score].[Education], [V_Score].[Education_Name], [V_Score].[Specialty], [V_Score].[Graduate_Date], [V_Score].[Company], [V_Score].[Address], [V_Score].[Telephone], [V_Score].[Zip]
PIVOT [V_Score].[Lesson_Name];

得到的结果是:
学号 姓名 课程1 课程2 课程3 ...
001 AAAA 87 89 78 ...
...
 
to BaKuBaKu:
1.我觉得xingeydh的要求不是你所说的这样,用他们(闪电、mataijin )的方法就行了
2.要注意TRANSFORM (交叉表查询)并不是都支持的
 
CREATE TRIGGER TRI_NAME
AFTER INSERT ON SOURSETABLE
FOR EACH ROW
BEGIN
INSERT INTO OBJECTABLE(
FIELD1,FIELD2,...)
VALUES(SELECT FIELD1,FIELD2,... FROM OBJECTABLE);
COMMIT;
END TRI_NAME
 
To lipingcool:
xingeydh 说,“sourcetable 表中添加记录后,自动的成为另一张表 objecttable 的<font color = #ff0000><strong>字段</font></strong>”!
闪电 和 mataijin 的方法用的是 Insert 语句,Insert 可以修改表的字段吗?
如果你觉得有另外的理解方式,请谈一谈!
还有 gerry yang 。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部