这是为检索Automation Suite数据而编写的查询之一:
SELECT DISTINCT CARR_TRAK_I,IBND_HDR_I FROM CTNR WHERE IBND_HDR_I IN
(SELECT IBND_HDR_I FROM IBND_HDR WHERE ORD_I IN
(SELECT ORD_I FROM IBND_HDR WHERE IBND_HDR_I IN
(SELECT top 1 IBND_HDR_I FROM CTNR WHERE CARR_TRAK_I IN
(SELECT CARR_TRAK_I FROM CTNR WHERE STAT_C = 0 and IBND_HDR_I IN
(SELECT IBND_HDR_I FROM IBND_HDR WHERE ORD_I IN
(SELECT ORD_I FROM IBND_HDR WHERE IBND_STAT_C =0 and STR_I = 3456 GROUP BY ORD_I HAVING count(ORD_I) >1))
GROUP BY CARR_TRAK_I HAVING count(CARR_TRAK_I)>1))))
ORDER BY IBND_HDR_I ASC
可以更好地编写此查询吗?
我不是在寻找优化,因为检索时间不是我的首要任务。我要求任何其他可用于编写相同的技术或方法,这比上述查询更好。
希望我自己清楚! 只想掌握SQL写作技巧:)
答案 0 :(得分:1)
您应该使用内部联接而不是嵌套查询,更容易阅读和理解。
这应该让你开始......
select distinct CTNR.CARR_TRAK_I, CTNR.IBND_HDR_I
from CTNR
INNER JOIN IBND_HDR
ON CTNR.IBND_HDR_I = IBND_HDR.IBND_HDR_I
INNER JOIN...
答案 1 :(得分:1)
无论何时一对一关系,您都可以使用内部联接。如果要像查询一样分组或者top1,请使用内部查询,如下所示。
还有一些更多的优化空间,但不要对数据进行采样以验证输出。 您可以在内部查询中执行相同的逻辑。如果可能,给出样本数据以验证输出。
请查看此示例。
select
distinct C.CARR_TRAK_I,C.IBND_HDR_I
from CTNR C
INNER JOIN IBND_HDR IH ON C.IBND_HDR = IH.IBND_HDR
INNER JOIN IBND_HDR IH1 ON IH.ORD_I = IH1.ORD_I AND IH1.IBND_HDR_I in
(
select top 1 IBND_HDR_I from CTNR C1
INNER JOIN CTNR C2 ON C1.CARR_TRAK_I = C2.CARR_TRAK_I AND STAT_C = 0
INNER JOIN IBND_HDR IBH2 ON IBH2.IBND_HDR_I = C1.IBND_HDR_I AND IBH2.ORD_I IN
(
select top 1 IBND_HDR_I from CTNR where CARR_TRAK_I in
(
select CARR_TRAK_I from CTNR where STAT_C = 0 and IBND_HDR_I in (
select IBND_HDR_I from IBND_HDR where ORD_I in
(select ORD_I from IBND_HDR where IBND_STAT_C =0 and STR_I = 3456 group by ORD_I having count(ORD_I) >1))
group by CARR_TRAK_I having count(CARR_TRAK_I)>1
)
)
)