数据库查询(新手提问)(200分)

  • 主题发起人 主题发起人 ZhangPing
  • 开始时间 开始时间
Z

ZhangPing

Unregistered / Unconfirmed
GUEST, unregistred user!
表一:
字段名 条件
FAA 中国
FAB 美国
FAC 英国
... ...

表二:
字段名 条件
FAA001 北京
FAA002 上海
... ...
FAB001 华盛顿
FAB002 纽约
... ...
表三:
字段名 人口
FAA001 3000000
FAA002 4000000
... ...

1。选中表一中“中国”后,应显示北京、上海...
2。北京、上海...栏可以多选
3。最后对应表三,根据多选项确定表三显示的字段
4。最好能将打印输出一并告之,不甚感激!
 
你设计的表结构不好,
1。表二和表三完全可以合并,因为城市与人口之间是一对一的关系;
2。表一和表二应有一个联系字段,所以表二要增加国家字段,以便与表一建立联系
查询可以用SQL语言
select 城市,人口 from 表二 where table2.国家=table1.国家
 
select a.条件 as 国家, b.条件 as 城市, c.条件 as 人口
from 表一 a, 表二 b, 表三 c
where (a.条件='中国')
and (substring(b.字段名 from 1 for 3) = a.字段名)
and (c.字段名=b.字段名)

 
如geshengping所说,你的数据库结构确实不合理
以我的编程经验,最好不要使用复杂查询,即用一条
SQL语句解决所有问题,而是利用TDBDataSet的
AfterScroll等事件来控制两表的对应。
 
修改表结构吧!
Table1:
字典编号 //主键(可设为自动加一)
字典级别
字典名称
。。。
删除标志
Table2:
字典编号 //主键,外键(Table1的字典编号)
父字典编号//外键(Table1的字典编号)
分成两个表是为了用数据库的外键保证“父字典编号”存在.

这样的结构可适应任意多级的字典维护!
这两天我已做完这种多级字典的维护程序,准备做成控件,有兴趣的话和我联系。
 
哎呀呀!谁设计的数据库这么臭!楼上很多大虾讲得很对.不过我不会按他们讲的
任何一种方法处理,因为只需要一个表!而且这个表只有四个字段:
ID(关键字段),整数啦!
Area(地区),只好是VarChar啦!尽管我讨厌VarChar字段.
Parent(父地区),整数,0当然是根项啦!
Popular(人中数),整数.哇塞!会不会超界?
ID AREA PARENT POPULAR
1 中国 0 12亿
2 美国 0 10亿
3 英国 0 1亿
4 北京 1 1200万
5 上海 1 1200万
6 华盛顿 2 500万
7 纽约 3 1000万
.........
如果只有一个表,你难道还不会设计它的SQL语句吗?
 
不好意思,我一直以为NewYork是英国的,你知道的,英国有个York郡.:=((
 
New England 是美国的:)))
 
barton, 您的一个表我的确不会设计sql达到如下显示要求:
国家 城市 人口
中国 北京 1200万
中国 上海 1200万
美国 纽约 1000万
美国 华盛顿 500万

....

请教请教(只许select ... from 一个表).
 
to:barton
分成两个表是为了用数据库的外键保证“父字典编号”存在.

to: Another_eYes
SELECT Dicts1.AREA,Dicts.AREA,Dicts.POPULAR
FROM Dicts,Dicts Dicts1
WHERE Dicts.PARENT=Dicts1.ID


我认为这种多级字典的维护还是做成TreeView较好。

还有ZhangPing的表也可以检索出这样的结果,不过表实在不该那样建!!!!!!

select table1.f2,
table2.f2,
table3.f2
from table1,table2,table3
where table1.f1=SubString(table2.f1,1,3) and
table2.f1=table3.f1 and
table1.f1=:Country //指定国家编号
 
barton,这不是人为增加复杂程度吗?
我支持geshengping和delphiwolf的意见。
 
to:曹晓钢
谢谢支持!
 
->Another_eYes:我永远不指望用这样的SQL语句;
->delphi狼,曹晓钢:嘻嘻!我不认为增加了复杂程度.

我设计了一个容器,一次将一个带相同属性字段的Master-Detail读入,可以通过
调用这个容器的方法建立TreeView或ListView,当然也可以增加删除和修改.
这个容器有四个事件:OnList(你自然会设计一个Select语句),
OnInsert(Insert语句),OnDelete(Delete语句),OnUpdate(Update语句).你明白
了--我不挑数据库的!
 
设想一下,如果这个结构是洲--国家--省--地区--县--乡--村,你一定打算设计
七个或更多的表!
 
诸位:
当今RDB时代还是设计成Master/Details结构的为好.
建议zhangping找本DB原理的书瞅瞅.改结构吧.
delphiwolf的意见就挺简洁的.
 
诸位讨论似乎偏题了吧?
怎么设计数据库是个人习惯问题. 再说, 既然提问, 不一定会将全部数据库结构列出的.
也许他这么设计数据库有他的道理. (比如还有很多相关字段存在于各表中, 只是问题里没有
列出而已)
 
直接回答zhangping的问题:
1、在表一中选出中国:
select 表一.字段名 from 表一 where 表一.条件='中国';
将结果付给x变量;
2、在表二中选出中国的各个地方:
select 表二.条件 from 表二 where mid(表二.字段名,1,3)=x;
3、实际上可以由下得出最后结果:
select 表二.条件 ,表三.人口 from 表二,表三 where 表三.字段名 in (se
lect 字段名 from 表二 where mid(表二.字段名,1,3)=x)
大体如此,可以试试!
但从长远角度讲,还是听上面各位的意见,将数据库结构改一下!:)
 
呵呵, 可以这样: 100% 可行.:-)
1.
select 表二.条件 from 表二,表一 where 表二.字段名 like 表一.字段名 + '%' and 表一.条件='中国'
2. 结果可以输入到 listbox中, 把MULTISELECT设成TRUE;
3.
select 表二.字段名, 表三.人口 from 表二,表三 where 表三.字段名 = 表二.字段名 and (表二.条件='北京' or 表二.条件='上海' or 表二.条件='广州')
4. 打印么, 使用REPORT构件就可以了.

 
to ZhangPing:
对我的答案不满意吗?
 
sorry!各位大虾,前两天不幸把电源烧坏,又破财又误事,抱歉!
对于各位的方法,我十分赞同,最终还是改了数据库结构.
实际上,我所列出的只是一种情况.第三个表中FAA001,FAA002...
作为字段名也是我遇到的问题.

to barton:实际数据库是一个,结构为三级.省.市.县.
to delphiwolf:You have a good idea .

感谢各位的支持和帮助!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部