Sql 尽管建议使用ANSI样式的联接,但在WHERE子句中指定联接条件仍然是完全有效的,并且优化器完全能够弄清楚发生了什么。我同意你的建议,即OP确保存在适当的索引。我有另一个与下面相同的查询,它比上面的查询稍微复杂一些,因为这需要查找大量表格并检查总价格和付款
Sql 尽管建议使用ANSI样式的联接,但在WHERE子句中指定联接条件仍然是完全有效的,并且优化器完全能够弄清楚发生了什么。我同意你的建议,即OP确保存在适当的索引。我有另一个与下面相同的查询,它比上面的查询稍微复杂一些,因为这需要查找大量表格并检查总价格和付款,sql,oracle,Sql,Oracle,尽管建议使用ANSI样式的联接,但在WHERE子句中指定联接条件仍然是完全有效的,并且优化器完全能够弄清楚发生了什么。我同意你的建议,即OP确保存在适当的索引。我有另一个与下面相同的查询,它比上面的查询稍微复杂一些,因为这需要查找大量表格并检查总价格和付款。没有“V”状态。它包括5个不同的表:Bob Jarvs:这样做相关子查询需要SQL返回每个子查询的整个结果集,进行笛卡尔连接,然后对其进行筛选。优化器无法提供帮助。@qwerty13579 Oracle不需要仅仅因为查询使用老式语法就进行笛卡
尽管建议使用ANSI样式的联接,但在WHERE子句中指定联接条件仍然是完全有效的,并且优化器完全能够弄清楚发生了什么。我同意你的建议,即OP确保存在适当的索引。我有另一个与下面相同的查询,它比上面的查询稍微复杂一些,因为这需要查找大量表格并检查总价格和付款。没有“V”状态。它包括5个不同的表:Bob Jarvs:这样做相关子查询需要SQL返回每个子查询的整个结果集,进行笛卡尔连接,然后对其进行筛选。优化器无法提供帮助。@qwerty13579 Oracle不需要仅仅因为查询使用老式语法就进行笛卡尔连接。如果您查看跟踪,您会发现Oracle会自动将大多数ANSI连接重新写入老式连接。鲍勃说得对。99.9%的情况下,这不会有什么不同。总有一些奇怪的情况下,重新编写语法样式似乎有帮助,但这是例外,而不是规则。尽管我同意,出于其他原因,使用较新的语法很重要。
{SELECT /*+ PARALLEL(5) */
EXTER.ACE_IT_REGION_ID ,
EXTER.ACE_IT_LOCATION_CODE,
EXTER.ACE_IT_ORD_NUM,
EXTER.TOTAL_ITEM_PRICE_PER_ORDER,
EXTER.TOTAL_ACE_PAYD_AMOUNT,
EXTER.ACE_ORD_COMPLETION_TIME AS DATEOFDATA
FROM
(SELECT /*+ use_hash(TAB1,TAB2) +*/
DISTINCT
TAB1.ACE_IT_REGION_ID ,
TAB1.ACE_IT_LOCATION_CODE,
TAB1.ACE_IT_ORD_NUM,
TAB1.TOTAL_ITEM_PRICE_PER_ORDER,
TAB2.TOTAL_ACE_PAYD_AMOUNT,
TAB1.ACE_ORD_COMPLETION_TIME
FROM
(SELECT AAA.ACE_IT_REGION_ID,
AAA.ACE_IT_LOCATION_CODE,
AAA.ACE_IT_ORD_NUM,
AAA.SUM_PRICE_PLUS_TAX,
AAA.TOTAL_DISCOUNT,
(AAA.SUM_PRICE_PLUS_TAX-AAA.TOTAL_DISCOUNT) AS TOTAL_ITEM_PRICE_PER_ORDER,
TRUNC(AAA.ACE_ORD_COMPLETION_TIME)
FROM (SELECT B.ACE_IT_REGION_ID AS ACE_IT_REGION_ID,
B.ACE_IT_LOCATION_CODE AS ACE_IT_LOCATION_CODE,
B.ACE_IT_ORD_NUM AS ACE_IT_ORD_NUM,
(SUM(B.ACE_IT_ITEM_PRICE + B.ACE_IT_TAX_AMT)*B.ACE_IT_QTY) AS SUM_PRICE_PLUS_TAX,
SUM(B.ACE_IT_DISC_AMT+B.ACE_IT_AUTO_DISC_AMT) AS TOTAL_DISCOUNT,
TRUNC(A.ACE_ORD_COMPLETION_TIME ) AS ACE_ORD_COMPLETION_TIME
FROM POSDB.ACE_ORDERS A, POSDB.ACE_ITEM_TRAN B
WHERE A.ACE_ORD_COMPLETION_TIME >= TRUNC(SYSDATE -1)
AND A.ACE_ORD_COMPLETION_TIME < TRUNC(SYSDATE)
AND A.ACE_ORD_REGION_ID = B.ACE_IT_REGION_ID
AND A.ACE_ORD_LOCATION_CODE = B.ACE_IT_LOCATION_CODE
AND A.ACE_ORD_NUM = B.ACE_IT_ORD_NUM
AND A.ACE_ORD_TYPE = 'IS'
AND (A.ACE_ORD_STATUS = 'CR'
OR A.ACE_ORD_STATUS IS NULL
OR A.ACE_ORD_STATUS LIKE ' %'
OR A.ACE_ORD_STATUS LIKE '% ')
AND (B.ACE_IT_VOID_IND <> 'V' OR B.ACE_IT_VOID_IND IS NULL )
GROUP BY B.ACE_IT_REGION_ID,
B.ACE_IT_LOCATION_CODE,
B.ACE_IT_ORD_NUM,
A.ACE_ORD_COMPLETION_TIME) AAA
ORDER BY AAA.ACE_IT_REGION_ID,
AAA.ACE_IT_LOCATION_CODE,
AAA.ACE_IT_ORD_NUM,
AAA.ACE_ORD_COMPLETION_TIME) TAB1,
(SELECT ACE_PAYD_REGION_ID,
ACE_PAYD_LOCATION_CODE,
ACE_PAYD_ORD_NUM,
SUM(ACE_PAYD_AMOUNT) TOTAL_ACE_PAYD_AMOUNT
FROM POSDB.ACE_PAYMENT_DTL
WHERE ACE_PAYD_POSTING_TIMESTAMP BETWEEN TRUNC(SYSDATE-1) AND TRUNC(SYSDATE)
AND (ACE_PAYD_STATUS <> 'V' OR ACE_PAYD_STATUS IS NULL )
GROUP BY
ACE_PAYD_REGION_ID,
ACE_PAYD_LOCATION_CODE,
ACE_PAYD_ORD_NUM) TAB2
WHERE TAB1.ACE_IT_REGION_ID = TAB2.ACE_PAYD_REGION_ID
AND TAB1.ACE_IT_LOCATION_CODE = TAB2.ACE_PAYD_LOCATION_CODE
AND TAB1.ACE_IT_ORD_NUM = TAB2.ACE_PAYD_ORD_NUM
ORDER BY
TAB1.ACE_IT_REGION_ID ,
TAB1.ACE_IT_LOCATION_CODE,
TAB1.ACE_IT_ORD_NUM ) EXTER
WHERE (EXTER.TOTAL_ITEM_PRICE_PER_ORDER = EXTER.TOTAL_ACE_PAYD_AMOUNT)
AND EXTER.ACE_ORD_COMPLETION_TIME IS NOT NULL;}
SELECT tab1.fld1, tab.fld2
FROM tab1
JOIN tab2 ON (tab2.ID = tab1.ID AND tab2.fld3 = 'xxx')
JOIN tab3 ON (tab3.ID2 = tab2.ID2)
WHERE tab1.fld4 = 'aaa'
and tab3.fld5 > 100
SELECT DISTINCT *
FROM
( SELECT
AAA.ACE_IT_REGION_ID,
AAA.ACE_IT_LOCATION_CODE,
AAA.ACE_IT_ORD_NUM,
AAA.SUM_PRICE_PLUS_TAX,
AAA.TOTAL_DISCOUNT,
AAA.SUM_PRICE_PLUS_TAX - AAA.TOTAL_DISCOUNT AS TOTAL_ITEM_PRICE_PER_ORDER,
TRUNC(AAA.ACE_ORD_COMPLETION_TIME) AS DATEOFDATA
FROM
( SELECT
B.ACE_IT_REGION_ID,
B.ACE_IT_LOCATION_CODE,
B.ACE_IT_ORD_NUM,
( SUM( B.ACE_IT_ITEM_PRICE + B.ACE_IT_TAX_AMT)
* B.ACE_IT_QTY ) AS SUM_PRICE_PLUS_TAX,
SUM( B.ACE_IT_DISC_AMT + B.ACE_IT_AUTO_DISC_AMT) AS TOTAL_DISCOUNT,
TRUNC( A.ACE_ORD_COMPLETION_TIME ) AS ACE_ORD_COMPLETION_TIME
FROM
POSDB.ACE_ORDERS A,
POSDB.ACE_ITEM_TRAN B
WHERE
A.ACE_ORD_TYPE = 'IS'
AND A.ACE_ORD_REGION_ID = B.ACE_IT_REGION_ID
AND A.ACE_ORD_LOCATION_CODE = B.ACE_IT_LOCATION_CODE
AND A.ACE_ORD_NUM = B.ACE_IT_ORD_NUM
AND A.ACE_ORD_COMPLETION_TIME >= TRUNC(SYSDATE -1)
AND A.ACE_ORD_COMPLETION_TIME < TRUNC(SYSDATE)
AND ( A.ACE_ORD_STATUS = 'CR'
OR A.ACE_ORD_STATUS IS NULL
OR A.ACE_ORD_STATUS LIKE ' %'
OR A.ACE_ORD_STATUS LIKE '% ')
AND ( B.ACE_IT_VOID_IND <> 'V'
OR B.ACE_IT_VOID_IND IS NULL )
GROUP BY
B.ACE_IT_REGION_ID,
B.ACE_IT_LOCATION_CODE,
B.ACE_IT_ORD_NUM,
A.ACE_ORD_COMPLETION_TIME ) AAA
ORDER BY
AAA.ACE_IT_REGION_ID,
AAA.ACE_IT_LOCATION_CODE,
AAA.ACE_IT_ORD_NUM,
AAA.ACE_ORD_COMPLETION_TIME) TAB1,
( SELECT
APD.ACE_PAYD_REGION_ID,
APD.ACE_PAYD_LOCATION_CODE,
APD.ACE_PAYD_ORD_NUM,
SUM(APD.ACE_PAYD_AMOUNT) TOTAL_ACE_PAYD_AMOUNT
FROM
POSDB.ACE_PAYMENT_DTL APD
WHERE
APD.ACE_PAYD_POSTING_TIMESTAMP
BETWEEN TRUNC(SYSDATE-1) AND TRUNC(SYSDATE)
AND ( APD.ACE_PAYD_STATUS <> 'V'
OR APD.ACE_PAYD_STATUS IS NULL )
GROUP BY
APD.ACE_PAYD_REGION_ID,
APD.ACE_PAYD_LOCATION_CODE,
APD.ACE_PAYD_ORD_NUM ) TAB2
WHERE
TAB1.ACE_IT_REGION_ID = TAB2.ACE_PAYD_REGION_ID
AND TAB1.ACE_IT_LOCATION_CODE = TAB2.ACE_PAYD_LOCATION_CODE
AND TAB1.ACE_IT_ORD_NUM = TAB2.ACE_PAYD_ORD_NUM
AND TAB1.TOTAL_ITEM_PRICE_PER_ORDER = TAB2.TOTAL_ACE_PAYD_AMOUNT,
AND TAB1.ACE_ORD_COMPLETION_TIME IS NOT NULL
ORDER BY
TAB1.ACE_IT_REGION_ID,
TAB1.ACE_IT_LOCATION_CODE,
TAB1.ACE_IT_ORD_NUM ) EX
table index on..
ACE_ORDERS ( ACE_ORD_TYPE, ACE_ORD_COMPLETION_TIME, ACE_ORD_REGION_ID, ACE_ORD_LOCATION_CODE, ACE_ORD_NUM, ACE_ORD_STATUS )
ACE_ITEM_TRAN ( ACE_IT_REGION_ID, ACE_IT_LOCATION_CODE, ACE_IT_ORD_NUM, ACE_IT_VOID_IND )
ACE_PAYMENT_DTL ( ACE_PAYD_POSTING_TIMESTAMP, ACE_PAYD_REGION_ID, ACE_PAYD_LOCATION_CODE, ACE_PAYD_ORD_NUM, ACE_PAYD_STATUS, ACE_PAYD_AMOUNT )