如何消除多表关联带来的可能的对结果集的影响

[复制链接]
查看11 | 回复2 | 2011-4-13 12:08:17 | 显示全部楼层 |阅读模式
如何消除多表关联带来的可能的对结果集的影响?
如下代码:
我要按多个维度统计多个指标,分别需要用主表关联多张表取得,
这里我不想分步去统计,于是写成了下面的多表关联的形式,
但是我总是纠结于多表关联可能带来的对结果集的影响
(典型的一个例子就是:附表有重复记录造成部分笛卡尔积将结果集放大)
求大虾指导如何精确判断多表关联是否产生逻辑上的影响?
我还想知道的一个是多表关联在逻辑上是否一定能代替分步统计?
SELECTA.LAN_CODE,

A.PPDOM_ID,
CASE WHENB.CUST_ID IS NOT NULLAND C.CUST_ID IS NULL THEN1

WHENC.CUST_ID IS NOT NULLAND B.CUST_ID IS NULL THEN2
WHENB.CUST_ID IS NOT NULLAND C.CUST_ID IS NOT NULL THEN3
ELSE 4ENDASCUST_TYPE,
COUNT(DISTINCT A.CUST_ID) AS CUST_CNT,
SUM (CASE WHEN A.SERV_STATE'F1R' AND A.STATE='F0A' AND A.OLD_FLAG 'F1R' AND B.STATE='F0A' AND B.OLD_FLAG 'F1R' AND B.STATE='F0A'AND B.OLD_FLAG=4096 THEN C.SERV_ID END) AS KD_CZ_CNT_4M,
COUNT(DISTINCT CASE WHENC.KD_TYPE LIKE '%包年%' THEN C.SERV_ID END) AS KD_CZ_CNT_YEAR,
COUNT(DISTINCT CASE WHENM.SERV_ID IS NOT NULL THEN C.SERV_ID END) AS KD_CZ_CNT_ITV,

COUNT(DISTINCT CASE WHEN D.MAIN_SERV_FLAG LIKE '1%' THEN D.SERV_ID END)GH_CZ_CNT,
COUNT(DISTINCT CASE WHEN D.MAIN_SERV_FLAG LIKE '1%' AND D.SERV_STATE'F1R' AND D.STATE='F0A' AND D.OLD_FLAG 'F1R' AND STATE='F0A' AND OLD_FLAG<2
)C ON A.SERV_ID = C.SERV_ID
LEFT JOIN (SELECT SERV_ID,SUM(COALESCE(CHARGE,0)) CHARGE,SUM(COALESCE(DURATION,0)) DURATION

FROM MK_LIST.PRD_CDMA_MID_NEW_MON_MID_KF_701_120201
GROUP BY SERV_ID) D
ON A.SERV_ID= D.SERV_ID
LEFT JOIN (

SELECT SERV_ID,COALESCE(SUM(INTERNET_DISCHARGE),0) INTERNET_DISCHARGE
FROM WH_VAD.TB_GROUP_SERV_ITEM_MON_701_120201

GROUP BY SERV_ID

) E ON A.SERV_ID = E.SERV_ID
LEFT JOIN WH_VAD.TB_MID_ITV_INFO_701_120201 M ON C.SERV_ID = M.SERV_ID
GROUP BYA.LAN_CODE,

A.PPDOM_ID,
CASE WHENB.CUST_ID IS NOT NULLAND C.CUST_ID IS NULL THEN1

WHENC.CUST_ID IS NOT NULLAND B.CUST_ID IS NULL THEN2
WHENB.CUST_ID IS NOT NULLAND C.CUST_ID IS NOT NULL THEN3
ELSE 4END
回复

使用道具 举报

千问 | 2011-4-13 12:08:17 | 显示全部楼层
逻辑上的影响就像你想象的那样,多表连接可能造成结果集中的数据多或者少,尤其你这里很多left outer join。
要判断是否产生逻辑上影响,首先检查主外键约束,如果没有相应的约束,就比较难办了,只好问业务人员实际的数据的含义来判断了。
你希望把这些都放在一个SQL里面返回,不需要这样多表关联。可以分别对AB, AC, AD的关联结果集进行聚集计算,然后把这些计算的结果按照A.LAN_CODE, A.PPDOM_ID连接起来。
不过上面的前提是A表不是很大,如果像数据仓库的多维模型-星型模型那样,A是一个非常大的事实表,B、C、D是维表的话,恐怕还是直接多表连接好,数据库一般都会针对星型连接进行优化。
回复

使用道具 举报

千问 | 2011-4-13 12:08:17 | 显示全部楼层
二楼指导的是,也慢慢找到症结了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行