错误的写法:
select a.*, b.goods_title from iw_account_log a left join beyond_trade_base b on a.TRANS_OUT_ORDER_NO = b.trade_no
where a.trans_code = '6003' and a.trans_account = #transacnt:varchar# and a.trans_dt > to_date(...)
正确的写法:
select a.*, b.goods_title from iw_account_log a, beyond_trade_base b
where a.TRANS_OUT_ORDER_NO = b.trade_no(+) and a.trans_code = '6003'
and a.trans_account = #transacnt:varchar# and a.trans_dt > to_date(...)
+ //这是左连接,也就是左边连过来的,如果碰到了右边没有,那么他只好连接一个空
我们在使用连接查询的时候,要明白子查询外连接和外连接查询的区别。
1、外连接
select PROM_PRODUCT.ID, PROM_PRODUCT.GMT_CREATE, PROM_PRODUCT.GMT_MODIFIED, PROM_PRODUCT.PROMOTION_ID, PROM_PRODUCT.PRODUCT_ID, PROM_PRODUCT.PRICE_TYPE,
PROM_PRODUCT.PRICE, PROM_PRODUCT.DISCOUNT,
PROM_PRODUCT.DISCOUNT_TEMPLATE_ID, PROM_PRODUCT.STOCK, PROM_PRODUCT.PURCHASE_LIMIT_NUM_MAX, PROM_PRODUCT.PURCHASE_LIMIT_NUM_MIN, PROM_PRODUCT.STATUS,
PROM_PRODUCT.MEMBER_SEQ, PROM_PRODUCT.ADMIN_MEMBER_SEQ, PROM_PRODUCT.IS_NEED_FREEZE_FORM, PROM_PRODUCT.IS_NEED_FREEZE_SHELF, PROM_PRODUCT.PP_START_DATE,
PROM_PRODUCT.PP_END_DATE, PROM_PRODUCT.IS_SUPPORT_VIP, PROM_PRODUCT.PAY_TIME_LIMIT, PROM_PRODUCT.LEVEL_PRICE, PROM_PRODUCT.JOIN_TIME, PROM_PRODUCT.VERIFY_TIME, PROM_PRODUCT.SUBJECT,
PROM_PRODUCT.HAS_PROMOTION_IMG, PROM_PRODUCT.PROMOTION_IMG_URL, PROM_PRODUCT.CATEGORY_ID, PROM_PRODUCT.PRODUCT_DISPLAY_ORDER,
PROM_PRODUCT.PROMOTION_CATEGORY_ID, PROM_PRODUCT.SUMMARY, PROM_PRODUCT.PHONE_NUMBER, PROM_PRODUCT.EXIT_REASON,PROM_PRODUCT.PROM_RULE,
product_stats.SALE_COUNT,product_stats.ORDER_PRODUCT_RATE,product_stats.SHOP_POSITIVE_RATE_90D,product_stats.ISSUE_NETRULE_RATE_90D,
product_stats.AVERAGE_STAR,product_stats.GMT_FIRST_ONLINE
from WS_PROM_PRODUCT PROM_PRODUCT,ws_prom_product_stats product_stats
where PROM_PRODUCT.product_id = product_stats.product_id(+)
AND PROM_PRODUCT.STATUS = #status:VARCHAR#
<isNotNull property="minSaleCount">
<![CDATA[ and product_stats.SALE_COUNT >= #minSaleCount:DECIMAL#]]>
</isNotNull>
<isNotNull property="minOrderProductRate">
<![CDATA[and product_stats.ORDER_PRODUCT_RATE >= #minOrderProductRate:DECIMAL#]]>
</isNotNull>
<isNotNull property="minShopPositiveRate90d">
<![CDATA[and product_stats.SHOP_POSITIVE_RATE_90D >= #minShopPositiveRate90d:DECIMAL#]]>
</isNotNull>
<isNotNull property="maxIssueNetruleRate90d">
<![CDATA[AND (product_stats.ISSUE_NETRULE_RATE_90D IS NULL OR product_stats.ISSUE_NETRULE_RATE_90D <= #maxIssueNetruleRate90d:DECIMAL#)]]>
</isNotNull>
<isNotNull property="minAverageStar">
<![CDATA[and product_stats.AVERAGE_STAR >= #minAverageStar:DECIMAL#]]>
</isNotNull>
这种查询是将product表和product_info表进行关联查出结果集以后,对查询结果集进行条件判断。如果不满足条件product和product_info都不显示。
2、子查询外连接
<include refid="PAGINATION.paginationStart" />
select PROM_PRODUCT.ID, PROM_PRODUCT.GMT_CREATE, PROM_PRODUCT.GMT_MODIFIED, PROM_PRODUCT.PROMOTION_ID, PROM_PRODUCT.PRODUCT_ID, PROM_PRODUCT.PRICE_TYPE,
PROM_PRODUCT.PRICE, PROM_PRODUCT.DISCOUNT,
PROM_PRODUCT.DISCOUNT_TEMPLATE_ID, PROM_PRODUCT.STOCK, PROM_PRODUCT.PURCHASE_LIMIT_NUM_MAX, PROM_PRODUCT.PURCHASE_LIMIT_NUM_MIN, PROM_PRODUCT.STATUS,
PROM_PRODUCT.MEMBER_SEQ, PROM_PRODUCT.ADMIN_MEMBER_SEQ, PROM_PRODUCT.IS_NEED_FREEZE_FORM, PROM_PRODUCT.IS_NEED_FREEZE_SHELF, PROM_PRODUCT.PP_START_DATE,
PROM_PRODUCT.PP_END_DATE, PROM_PRODUCT.IS_SUPPORT_VIP, PROM_PRODUCT.PAY_TIME_LIMIT, PROM_PRODUCT.LEVEL_PRICE, PROM_PRODUCT.JOIN_TIME, PROM_PRODUCT.VERIFY_TIME, PROM_PRODUCT.SUBJECT,
PROM_PRODUCT.HAS_PROMOTION_IMG, PROM_PRODUCT.PROMOTION_IMG_URL, PROM_PRODUCT.CATEGORY_ID, PROM_PRODUCT.PRODUCT_DISPLAY_ORDER,
PROM_PRODUCT.PROMOTION_CATEGORY_ID, PROM_PRODUCT.SUMMARY, PROM_PRODUCT.PHONE_NUMBER, PROM_PRODUCT.EXIT_REASON,PROM_PRODUCT.PROM_RULE,
product_stats.SALE_COUNT,product_stats.ORDER_PRODUCT_RATE,product_stats.SHOP_POSITIVE_RATE_90D,product_stats.ISSUE_NETRULE_RATE_90D,
product_stats.AVERAGE_STAR,product_stats.GMT_FIRST_ONLINE
from WS_PROM_PRODUCT PROM_PRODUCT,(SELECT product_id,
SALE_COUNT,ORDER_PRODUCT_RATE,SHOP_POSITIVE_RATE_90D,ISSUE_NETRULE_RATE_90D,
AVERAGE_STAR,GMT_FIRST_ONLINE FROM ws_prom_product_stats
<dynamic prepend="where">
<isNotNull prepend="and" property="minSaleCount">
<![CDATA[ SALE_COUNT >= #minSaleCount:DECIMAL#]]>
</isNotNull>
<isNotNull prepend="and" property="minOrderProductRate">
<![CDATA[ ORDER_PRODUCT_RATE >= #minOrderProductRate:DECIMAL#]]>
</isNotNull>
<isNotNull prepend="and" property="minShopPositiveRate90d">
<![CDATA[ SHOP_POSITIVE_RATE_90D >= #minShopPositiveRate90d:DECIMAL#]]>
</isNotNull>
<isNotNull prepend="and" property="maxIssueNetruleRate90d">
<![CDATA[ (ISSUE_NETRULE_RATE_90D IS NULL OR ISSUE_NETRULE_RATE_90D <= #maxIssueNetruleRate90d:DECIMAL#)]]>
</isNotNull>
<isNotNull prepend="and" property="minAverageStar">
<![CDATA[ AVERAGE_STAR >= #minAverageStar:DECIMAL#]]>
</isNotNull>
</dynamic>
) product_stats
where PROM_PRODUCT.product_id = product_stats.product_id(+)
AND PROM_PRODUCT.STATUS = #status:VARCHAR#
<isNotNull property="categoryId">
and PROM_PRODUCT.CATEGORY_ID = #categoryId:VARCHAR#
</isNotNull>
<isNotNull property="productId">
and PROM_PRODUCT.PRODUCT_ID = #productId:DECIMAL#
</isNotNull>
这种是子查询先通过条件判断,查询出结果集,然后和product表进行关联。子查询已经将结果进行了一次过滤。这样就造成product表有记录,而子查询没有记录的情况也显示。