Sql 需要帮助调整查询-使用串联字段的左连接无效
我编写了一个查询,从一个嵌套查询中的两个字段的值等于一个表中的两个对应字段的填充中筛选出记录。我尝试使用两个键字段的串联作为查找 虽然这确实让我得到了我正在寻找的结果,但这种方法似乎效率很低,因为查询大约需要60秒才能返回结果(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
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是否允许与没有区别,所以我在或