急!!!请问如何从两个表中查询记录并在一个DbGrid中显示!!(150分)

  • 主题发起人 主题发起人 puremoonstone
  • 开始时间 开始时间
P

puremoonstone

Unregistered / Unconfirmed
GUEST, unregistred user!
高手,我遇到麻烦了,时间紧迫,特此求教!
我准备从同一个库的两张表table1和table2:
table1中的字段为:进仓单号、品名、规格、等级、数量、件数
table2中的字段为:进仓单号、品名、等级、数量、件数(注意:没有规格)
中查询出 进仓单号=Number(一个String变量) 的所有记录,并显示在同一个DbGrid中(即
先显示从table1中查到的记录,再显示从table2中查到的记录)。
DbGrid中要显示的字段为:进仓单号、品名、规格、等级、数量、件数。(对于从table2
中查出的记录因为没有“规格”,所以在DbGrid中不用显示)。
我写了一点程序,但调试有问题:
//准备开始从table1、table2中根据进仓单号查找满足条件的记录(我用的是ADOQurey,ADOConnection,DbGrid,DataSource等控件)
with adoquery1 do
begin
with sql do
begin
close;
clear;
add('select table1.*,table2.* ');
add('from table1,table2');
add('where table1.进仓单号=:number1 or table2.进仓单号=:number1');
Parameters[0].DataType:=ftString;
Parameters[0].Direction :=pdInput;
Parameters[0].Value:=number1;
end; //end with sql
open;
end;
如果只从一个表查数据可以正确查出记录,但从两个表中查询有问题。
此外,我希望在DbGrid中显示的格式如下:
进仓单号 品名 等级 数量 件数 单价
一定不能显示成这样:
table1.进仓单号 table1.品名 table1.规格 table1.数量 table1.件数 table1.等级 table2.进仓单号 table2.品名 table2.数量 table2.件数 table2.
我知道用select table1.*,table2.* 选出来显示到DbGrid中达不到这种要求,特向大家求教!
请尽快帮忙,感之不尽!谢谢!
 
做一个临时表,dbgrid查询这个临时表
 
请高手回答详细一点,最好给出完整思路和完成此功能的程序(不要求完整,但一定要是调试成功的)!谢谢。
 
table1中的字段为:进仓单号、品名、规格、等级、数量、件数
table2中的字段为:进仓单号、品名、等级、数量、件数(注意:没有规格)
关键是不是没有规格字段啊,可以不用临时表,用union关键字
access里sql可以这样:
(select 进仓单号,品名,规格,等级,数量,件数 from table1 where 进仓单号=:YUNO)
union
(select 进仓单号,品名,"未知" as 规格,等级,数量,件数 from table2 where 进仓单号=:YUNO)
那个“未知”可以按你的需要换,我这里只在access里试过
 
嘿嘿,我不是啥子高手,不过这个问题确实不难,

我的意思是你多建一个临时表,再写一个存储过程,假设临时表名为tmptb,
create procedure dbtb
declare @n int input
(
delete tmptb
insert tmptb
(select 进仓单号 品名 等级 数量 件数 单价 from table1 where 进仓单号=@n)
insert tmptb
(select 进仓单号 品名 等级 数量 件数 单价 from table2 where 进仓单号=@n)
)

然后你每次查询前先运行这个存储过程,然后adoquery只查询这个临时表tmptb就行乐。

手上没有资料,好久不写了。sql语法可能有问题,自己查一下书。
 
Sorry,忘了告诉大家,我的库是用SQL Server7.
如果用select ... union ,那么查出来的字段显示 应该为:
table1.进仓单号 table1.品名 table1.规格 table1.数量 table1.件数 table1.等级 table2.进仓单号 table2.品名
table2.数量 table2.件数
我想要的格式为:
品名,规格,数量,件数,等级(即table1和table2都有的字段只显示一次,因为实际查出的记录
或者来自于table1,或者来自于table2,table1和table2的其他字段都相同,只是table2没有“规格”这个字段)

 
TDBGrid 只能连接一个数据集,所以你的解决方法应该从数据集的 Select 着手。
Select 支持 Union 语法,你应该一次性把两个表的记录 Select 出来,比如:
Select 进仓单号, 品名, 规格, 等级, ... From Table1
Where XXX
Union
Select 进仓单号, 品名, ,"未知" As 规格, 等级, ... From Table2
Where XXX
两个 Select 语句的字段名和字段类型应该完全一致,如果字段名不同,可以用 As 强制一致。
<font color = #ff0000><strong>需要注意的是</font></strong>,两个 Select 语句的结果不要有完全相同的记录,否则只会保留一个,如果可能
出现这种情况,可以加一个标志字段,例如;
Select 1 As Flag, 进仓单号, 品名, 规格, 等级, ... From Table1
Where XXX
Union
Select 2 As Flag, 进仓单号, 品名, ,"未知" As 规格, 等级, ... From Table2
Where XXX

 
呵呵,table1里不会有“未知”的规格吧,如果有,就改成不重复的即可 如:“还是未知:)”
 
我试着用union,但系统提示语法错误,我对SQL语法不熟,请帮忙看看!
with sql do
begin
close;
clear;
add('select 进仓单号,品名,规格,等级,公量,件数');
add('from 丝类产品入库单');
add('where 进仓单号=:condition1');
Parameters[0].DataType:=ftString;
Parameters[0].Direction :=pdInput;
Parameters[0].Value:=condition1;
add('union');
add('select 进仓单号,品名,,"" as 规格 ,等级,,"数量" as 公量,件数');
add('from 绸类产品入库单');
add('where 进仓单号=:condition2');
Parameters[1].DataType:=ftString;
Parameters[1].Direction :=pdInput;
Parameters[1].Value:=Condition2;
end; //end with sql
open;
end;
 
在AQOQUERY中应用SQL中的UNION语句完全可以达到目的!
按BaKuBaKu说的应该没错!
 
add('(select 进仓单号,品名,规格,等级,公量,件数 ');
add('from 丝类产品入库单 ');
add('where 进仓单号=:condition1 ');
add(') union (');
add('select 进仓单号,品名,"" as 规格 ,等级,"数量" as 公量,件数 ');
~~最好不要是“”,去掉多余的,
add('from 绸类产品入库单 ');
add('where 进仓单号=:condition2 )');
Parameters[0].DataType:=ftString;
Parameters[0].Direction :=pdInput;
Parameters[0].Value:=condition1;
Parameters[1].DataType:=ftString;
Parameters[1].Direction :=pdInput;
Parameters[1].Value:=Condition2;
试一试先,呵呵我更不是什么高手,万事最后还是靠自己
 
还是不行!语法有错!
 
你先不要用参数,直接在sql server里建立查询,看是否正确
oicq:8252170
 
你的引号不对!
'Select 进仓单号,品名,,<font color = #ff0000><strong>""</font></strong> as 规格 ,等级,,<font color = #ff0000><strong>"</font></strong>数量<font color = #ff0000><strong>"</font></strong> as 公量,件数'
应该用两个单引号 “ '' ”代替一个双引号 “"”,比如:
'Select 进仓单号,品名,,<font color = #ff0000><strong>''''</font></strong> As 规格 ,等级,,<font color = #ff0000><strong>''</font></strong>数量<font color = #ff0000><strong>''</font></strong> As 公量,件数'

 
“,”也多了些吧,为什么
 
不错,为什么要写两个逗号呢?刚才没看到!
 
给第二个表没有的字段的起个别名啊,数值可以为空,然后对两个表检索,再用UNION。
 
谢谢大家,问题得到圆满解决。
'Select 进仓单号,品名,,'''' As 规格 ,等级,,''数量'' As 公量,件数'
改为
'Select 进仓单号,品名,'''' As 规格 ,等级,数量 As 公量,件数'
或'Select 进仓单号,品名,'''' ,等级,数量,件数'都可。(但我想后者可能只是碰巧,因为在我的两个表中“数量”和“公量”的datatype完全相同)
在此特别感谢BaKuBaKu,g622,小猪(因为时间关系,小猪的办法我没试)!
再次感谢!以后还请多多指教!
 
也特别感谢surpass,他给我的回答在留言板中,当时我没看到。致以最衷心的感谢!
 
后退
顶部