这个查询可以写得更好吗?

时间:2014-11-19 05:07:13

标签: sql sql-server

这是为检索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写作技巧:)

2 个答案:

答案 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
            )
        )
    )