本帖最后由 liuxiulian 于 2011-11-10 11:47:46 编辑

解决方案 »

  1.   

    建一个视图比较方便,这样你就可以用Archives中的vid来v_village中查省,市,镇,村
    CREATE OR REPLACE VIEW v_village
    AS
       SELECT p.ID, p.province_name, c.cid, c.city_name, t.tid, t.town_name,
              v.vid, v.village_name
         FROM province p, city c, town t, village v
        WHERE v.tid = t.tid AND t.cid = c.cid AND c.ID = p.ID
    select * from Archives a,v_village v where a.vid=v.vid
      

  2.   

    谢谢两位朋友,
    LuiseRADL 说的“创建档案表是,加入省、市、镇、村的id”
    这样的话,如果省、市、镇、村如果之间的关系有变动的话,同时也要修改档案表了,譬如说把某一村从一个镇移到另一个镇。这样档案表也同时要修改省、市、镇、村的id。这样的话,是不是比较麻烦呢?---
    还有一个问题是,现在除了给档案加上地市。同时还要给档案加上存储位置(譬如:仓,房,架,箱),也是四级(和省、市、镇、村之间的逻辑关系一样)。
    现在也要显示档案的存储位置。CREATE OR REPLACE VIEW v_village
    AS
       SELECT p.ID, p.province_name, c.cid, c.city_name, t.tid, t.town_name,
              v.vid, v.village_name
         FROM province p, city c, town t, village v
        WHERE v.tid = t.tid AND t.cid = c.cid AND c.ID = p.ID这上面已经级联了4张表了。
    如果同时显示存储位置 ,那这样一来 ,那在查询语句里面一共要级联8张表,这样的话查询速度是不是要受很大影响呢
      

  3.   

    不会的,这几个表里面的资料应该都比较少,而且都是主外键关联查询,对oracle来说没什么影响.
      

  4.   

    --用户档案表
    create table Archives
    (
      id int ,
      a_name varchar2(50),--姓名
      a_sex char(1),--性别
     ........
     vid int ---外键村id
    )红字部分id varchar2(18),个人觉得模仿身份证号码
    1-2位是省的代号
    3-4位是市的代号
    5-6位是县的代号
    7-14位是出生年月日
    15-16位是当地派出所的代号
    17为为性别代号(奇数男,偶数女),
    18校验码(0-9随机)
    这样外键vid int ---外键村id可以去除
    通过截取id的位数来获取省、市、镇、村的信息
      

  5.   

    o 呵呵   那如果是access 数据库呢,也能按以上的那种写法吗?
      

  6.   

    xpingping 说的办法不错呢,不过想了下,这边的身份 证也有15  位的。所以用不了这种的办法
      

  7.   

    access不知道额,只闻其名,不见其用. 估计还可以的,只要数据量不大
      

  8.   

    你的字典层数是不是不会变了,只要不变,把4级地域 放在一张表里 4级存放地 放在一张表里结构:ID  名称  父ID
      

  9.   

    额……给力哇,
    提供2种方法
    1)id varchar(19)
    录入数据时如果是18为的身份证 为x+身份证号码
    如果是15为的身份证 y+身份证号
    x就18的身份证编码方式
    y就15的身份证编码方式2)在 用户档案表 加个字段 flag varchar(1), o为18,1为15
    flag =o 就18的身份证编码方式
    flag =1 就15的身份证编码方式
      

  10.   

    同意LuiseRADL 的说法,我的那个方法好像不是很实际,考虑得不够长远
     
      

  11.   

    恩  forgetsam  这个办法不错呢但是这样我要查用户信息,地市信息怎么
    写级联语句呢?
      

  12.   

    如果非Oracle:
      select
          c1.name as 村名,
          c2.name as 镇名,
          c3.name as 市名,
          c4.name as 省名,
          z.* from  用户主表 z 
      left join 地址代码表 c1 on z.村ID = c1.id
      left join 地址代码表 c2 on c1.pid = c2.id
      left join 地址代码表 c3 on c2.pid = c3.id
      left join 地址代码表 c4 on c3.pid = c4.idOracle 数据库用 connect by 搞定