oracle标准语法外连接和子查询外连接,而不采用ANSI连接

不使用ANSI连接,如inner join、left join、right join、full outer join,而使用(+)来表示外连接

      错误的写法:
      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表有记录,而子查询没有记录的情况也显示。


你可能感兴趣的:(JOIN,oracle,Date,null,url,include)