Sql 需要帮助调整查询-使用串联字段的左连接无效

Sql 需要帮助调整查询-使用串联字段的左连接无效,sql,oracle,query-optimization,Sql,Oracle,Query Optimization,我编写了一个查询,从一个嵌套查询中的两个字段的值等于一个表中的两个对应字段的填充中筛选出记录。我尝试使用两个键字段的串联作为查找 虽然这确实让我得到了我正在寻找的结果,但这种方法似乎效率很低,因为查询大约需要60秒才能返回结果(CRM.ASSET\u PLUS表有超过1000万条记录)。假设我无法筛选出任何内容,并且不在CRM.ASSET\u PLUS中创建自定义字段,这两个字段已经连接在一起 有没有更好的方法让我这样做 SELECT DISTINCT A.ACCOUNT_NUMBER FR

我编写了一个查询,从一个嵌套查询中的两个字段的值等于一个表中的两个对应字段的填充中筛选出记录。我尝试使用两个键字段的串联作为查找

虽然这确实让我得到了我正在寻找的结果,但这种方法似乎效率很低,因为查询大约需要60秒才能返回结果(
CRM.ASSET\u PLUS
表有超过1000万条记录)。假设我无法筛选出任何内容,并且不在
CRM.ASSET\u PLUS
中创建自定义字段,这两个字段已经连接在一起

有没有更好的方法让我这样做

SELECT DISTINCT A.ACCOUNT_NUMBER
  FROM (SELECT C.ACCOUNT_NUMBER,
               A.LOCATION_ACCOUNT_ID || A.PRODUCT_ID AS LOOKUP
          FROM CRM.ASSET_PLUS A,
               CRM.PROD_INT B,
               CRM.ACCOUNT C,
               CRM.ACCOUNT D
         WHERE A.PRODUCT_ID = B.ROW_ID
           AND A.LOCATION_ACCOUNT_ID = C.ACCOUNT_ID
           AND C.PARENT_ID = D.ACCOUNT_ID
           AND D.ACCOUNT_NUMBER = '00750333'
       ) A
   LEFT JOIN (SELECT A.LOCATION_ACCT_ID || A.PRODUCT_ID AS LOOKUP
                FROM ORDER_FORM_PRODUCTS A
               WHERE A.AGREEMENT_NUM = '00750333_JUN2014'
             ) B
     ON A.LOOKUP = B.LOOKUP
  WHERE B.LOOKUP IS NULL;

尝试连接多个字段,而不是连接

SELECT DISTINCT
    A.ACCOUNT_NUMBER
FROM 
    CRM.ASSET_PLUS A,
    CRM.PROD_INT B,
    CRM.ACCOUNT C,
    CRM.ACCOUNT D
LEFT JOIN ORDER_FORM_PRODUCTS E 
    ON (E.LOCATION_ACCOUNT_ID = A.LOCATION_ACCOUNT_ID
       OR (E.LOCATION_ACCOUNT_ID IS NULL AND A.LOCATION_ACCOUNT_ID IS NULL))
    AND (E.PRODUCT_ID = A.PRODUCT_ID 
        OR (E.PRODUCT_ID IS NULL AND A.PRODUCT_ID IS NULL))
    AND E.AGREEMENT_NUM = '00750333_JUN2014'
WHERE 
    A.PRODUCT_ID = B.ROW_ID 
    AND A.LOCATION_ACCOUNT_ID = C.ACCOUNT_ID
    AND C.PARENT_ID = D.ACCOUNT_ID
    AND D.ACCOUNT_NUMBER = '00750333'
    AND E.LOCATION_ACCOUNT_ID IS NULL
    AND E.PRODUCT_ID IS NULL
为了清晰起见,我建议将联接显式化

SELECT DISTINCT
    A.ACCOUNT_NUMBER
FROM 
    CRM.ASSET_PLUS A
    JOIN CRM.PROD_INT B ON A.PRODUCT_ID = B.ROW_ID
    JOIN CRM.ACCOUNT C ON A.LOCATION_ACCOUNT_ID = C.ACCOUNT_ID
    JOIN CRM.ACCOUNT D ON C.PARENT_ID = D.ACCOUNT_ID
        AND D.ACCOUNT_NUMBER = '00750333'
    LEFT JOIN ORDER_FORM_PRODUCTS E 
       ON (E.LOCATION_ACCOUNT_ID = A.LOCATION_ACCOUNT_ID
         OR (E.LOCATION_ACCOUNT_ID IS NULL AND A.LOCATION_ACCOUNT_ID IS NULL))
       AND (E.PRODUCT_ID = A.PRODUCT_ID 
         OR (E.PRODUCT_ID IS NULL AND A.PRODUCT_ID IS NULL))
       AND E.AGREEMENT_NUM = '00750333_JUN2014'
WHERE 
    E.LOCATION_ACCOUNT_ID IS NULL
    AND E.PRODUCT_ID IS NULL

B.xxx为NULL的
左连接(选择…)B相当于
不存在(…)
这不会产生相同的结果。过滤掉E.LOCATION\u ACCOUNT\u ID不为null且E.PRODUCT\u ID为null的记录(反之亦然)。我只需要过滤E.PRODUCT\u ID和E.LOCATION\u ACCOUNT\u ID都为空的记录。@StephenT使用
更新为join与
没有区别@StephenT我实际上不确定oracle是否允许
没有区别,所以我在