子查询 关联查询 中间表的综合使用

SQL 连接(JOIN) 

需求:

  • 查询工商注册信息与系统中登记信息不一致的问题
  • 一致的字段不标记,不一致的字段标记  “●”
  • 如果外部系统只要有一个出资人股权比例为空  , 股权比例  预警的时候就显示空心圆

SQL查询指导思想: 

  • 注意 left join 、join 的查询区别
  • case when 的使用
  • 关联查询得到一个虚拟的中间表   可基于中间表再做相关的关联查询、子查询...
  • 先想好怎么处理    将一个复杂问题 拆分为多个简单的问题   最后拼接即可

 查询结果预览:

  • 部分展示字段

牛刀小试: 

SELECT
	count( a.unitid ) AS "条数",
	HEX( a.unitid ) AS "单位ID" 
FROM
	PMS_COMPANY_HOLDER AS a 
WHERE
	a.HOLDER_ZB_NEW = '' 
	AND HEX( a.unitid ) IN (
SELECT
	HEX( g.unitid ) 
FROM
	GXJT_YJ AS g
	LEFT JOIN md_org AS m ON m.recid = g.unitid
	LEFT JOIN PMS_COMPANY_INFO AS p ON m.recid = p.unitid 
WHERE
	HEX( g.unitid ) LIKE '%67%' 
	AND g.warningType = 'REGISTRATION_DIFFERENT' 
	) 
GROUP BY
	a.unitid

 大展身手:

define query ad_query(@unitId string)                  
begin   
SELECT
	w.stdname AS "单位",
CASE	
	WHEN w.WARNINGREASON CONTAINS 'COMPANY_NAME' THEN
	'       ●' 
	END AS "企业名称",
CASE	
		WHEN y.num > 0 THEN
		'       ○' 
		WHEN w.WARNINGREASON CONTAINS 'EQUITY_SITUATION' THEN
		'       ●' 
	END AS "股权情况",
CASE
		WHEN w.WARNINGREASON CONTAINS 'LEGAL_REPRESENTATIVE' THEN
		'       ●' 
	END AS "法定代表人",
CASE
		WHEN w.WARNINGREASON CONTAINS 'REGISTERED_CAPITAL' THEN
		'       ●' 
	END AS "注册资本",
CASE
		WHEN w.WARNINGREASON CONTAINS 'REGISTRATION_PROVIENCE' THEN
		'       ●' 
	END AS "注册地",
CASE
		WHEN w.WARNINGREASON CONTAINS 'REGISTRATION_DATE' THEN
		'       ●' 
	END AS "注册日期",
	w.COMPANY_S_EXT_NODENUM AS "所属省份",
	w.UNITID AS "单位id",
	w.GQ_DATATIME AS "股权数据时期",
	w.GS_DATATIME AS "工商数据时期" 
FROM
	(
	SELECT
		m.stdname,
	CASE	
			WHEN g.WARNINGREASON CONTAINS 'COMPANY_NAME' THEN
			'       ●' 
		END AS "COMPANY_NAME",
	CASE	
			WHEN g.WARNINGREASON CONTAINS 'EQUITY_SITUATION' THEN
			'       ●' 
		END AS "EQUITY_SITUATION",
	CASE	
			WHEN g.WARNINGREASON CONTAINS 'LEGAL_REPRESENTATIVE' THEN
			'       ●' 
		END AS "LEGAL_REPRESENTATIVE",
	CASE	
			WHEN g.WARNINGREASON CONTAINS 'REGISTERED_CAPITAL' THEN
			'       ●' 
		END AS "REGISTERED_CAPITAL",
	CASE	
			WHEN g.WARNINGREASON CONTAINS 'REGISTRATION_PROVIENCE' THEN
			'       ●' 
		END AS "REGISTRATION_PROVIENCE",
	CASE	
			WHEN g.WARNINGREASON CONTAINS 'REGISTRATION_DATE' THEN
			'       ●' 
		END AS "REGISTRATION_DATE",
		p.COMPANY_S_EXT_NODENUM AS "COMPANY_S_EXT_NODENUM",
		g.UNITID AS "UNITID",
		g.GQ_DATATIME AS "GQ_DATATIME",
		g.GS_DATATIME AS "GS_DATATIME",
		g.WARNINGREASON AS "WARNINGREASON" 
	FROM
		GXJT_YJ AS g
		JOIN md_org AS m ON m.recid = g.unitid
		JOIN PMS_COMPANY_INFO AS p ON m.recid = p.unitid 
	WHERE
		to_char ( m.parents ) CONTAINS ( to_char ( @unitId ) ) 
		AND g.warningType = 'REGISTRATION_DIFFERENT' 
	) AS w
	LEFT JOIN (
	SELECT
		count( a.unitid ) AS num,
		a.unitid 
	FROM
		PMS_COMPANY_HOLDER AS a 
	WHERE
		a.HOLDER_ZB_NEW = '' 
		AND a.unitid IN (
		SELECT
			g.unitid 
		FROM
			GXJT_YJ AS g
			JOIN md_org AS m ON m.recid = g.unitid
			JOIN PMS_COMPANY_INFO AS p ON m.recid = p.unitid 
		WHERE
			to_char ( m.parents ) CONTAINS ( to_char ( @unitId ) ) 
			AND g.warningType = 'REGISTRATION_DIFFERENT' 
		) 
	GROUP BY
	a.unitid 
) AS y ON y.unitid = w.UNITID

end

猜你喜欢

转载自blog.csdn.net/xiangwang2016/article/details/102738235