要找到Dept->Zone的固定逻辑:基本通配: Bs (Dept, Zup)
例外城市: Ex (Dept, ZID) 
数据登记时首先记录部门负责的省份信息,随数据到达登记例外城市信息;
提取时:select Bs.Dept, isnull(Ex.ZID,b1.ZID) -- 基本通配的省份包含城市
from Bs 
left join TB_CITY b1 on b1.Zup = Bs.Zup
left join Ex on Ex.Dept = Bs.Dept
where not exists (select 1 from Ex e2
    join TB_CITY e1 on e1.ZID=e2.ZID
    where e2.Dept!=Bs.Dept
    and e2.ZID = b1.ZID) 

解决方案 »

  1.   

    假设有表
    Create Table TB_CUSTOMER( 
        ZID  int not null default 0, /* 客户ID */
        ZNAME        VarChar(10) , /* 客户名称*/ 
        ZCITY_ID     VarChar(6) ,   /* 所在城市*/ 
    Constraint PK_TB_DEPART_ZONE Primary Key(ZID )) 
    ENGINE=InnoDB; 数据估计10W左右,根据规则,做能方便地检索出所属某部门的客户的 设计
      

  2.   

    比如方案1、
    SELECT * FROM TB_CUSTOMER WHERE ZCITY_ID IN (SELECT ZCITY_ID FROM TB_DEPART_ZONE WHERE ZDEPART
    _ID=参数 )
      

  3.   

    A部门负责江苏省和安徽省,我不想将这两个省的所有城市和部门ID进行登记。
      

  4.   

    你的思路可行。呵呵。
    SELECT m.ZID FROM TB_CONSUMER m LEFT JOIN TB_CITY ct ON m.ZCITY_ID = ct.ZID
    WHERE ct.ZUP IN (SELECT Zup FROM 基本通配 WHERE Dept=部门参数)
    UNION
    SELECT ZID FROM TB_CONSUMER WHERE ZCITY_ID IN (SELECT ZID FROM 例外城市 WHERE Dept=部门参数 AND 列外标志是包含的=1)
    UNION(怎么除去)
    SELECT ZID FROM TB_CONSUMER WHERE ZCITY_ID IN (SELECT ZID FROM 例外城市 WHERE Dept=部门参数 AND 列外标志是包含的=-1)即:假如你拥有浙江范围的所有城市,但不包括杭州该怎么办,呵呵。
      

  5.   

    引用 6 楼 qinhl99 的回复:
    怎么觉得这么复杂呢? 
    一个城市表,一个部门表,一个城市和部门的关系表 
     
    A部门负责江苏省和安徽省,我不想将这两个省的所有城市和部门ID进行登记。//这个是由程序来完成了,对软件来说,添加一个省的所有市和一个市是一样的,基本上也没有给开发增加工作量,就一个部门城市表结构上很清晰,反倒易于开发。
      

  6.   

    对的。
    如果城市粒度更细的话我不这样做的。理由:通过JOIN连接表来检索数据比通过 IN 来检索快。