要找到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)
例外城市: 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)
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左右,根据规则,做能方便地检索出所属某部门的客户的 设计
SELECT * FROM TB_CUSTOMER WHERE ZCITY_ID IN (SELECT ZCITY_ID FROM TB_DEPART_ZONE WHERE ZDEPART
_ID=参数 )
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)即:假如你拥有浙江范围的所有城市,但不包括杭州该怎么办,呵呵。
怎么觉得这么复杂呢?
一个城市表,一个部门表,一个城市和部门的关系表
A部门负责江苏省和安徽省,我不想将这两个省的所有城市和部门ID进行登记。//这个是由程序来完成了,对软件来说,添加一个省的所有市和一个市是一样的,基本上也没有给开发增加工作量,就一个部门城市表结构上很清晰,反倒易于开发。
如果城市粒度更细的话我不这样做的。理由:通过JOIN连接表来检索数据比通过 IN 来检索快。