具有变量的普遍SQL子查询

问题描述

要在不到几分钟的执行时间内获取所需的数据,我有2个独立的查询

select
    ' ' as POHI_ACD,LTRIM(RTRIM(OePo_Header.PO_ID)) as POHI_PONUM,' ' as POHI_POTYP,' ' as POHI_VND,LTRIM(RTRIM(OePo_Header.CLIENT_ID)) as POHI_CO,'B1' as POHI_WA,'n/a' as PODI_COMMNT,-- Comment filled in separate query
    ' ' as POHI_CUSER,' ' as POHI_TSCRT,' ' as POHI_pgmUP,' ' as POHI_USRUP,'01/01/0001 00:00:00' as POHI_TSLUP,' ' as POHI_FILEPATH
from (
        OePo_Header
        inner join OePo_Item 
        on OePo_Header.PO_ID = OePo_Item.PO_ID
    )
    left join OePo_Remarks
    on OePo_Header.WHSE_INST_ID = OePo_Remarks.AUTOKEY
    and OePo_Header.PO_ID = OePo_Remarks.PO_ID
where (
        (OePo_Item.UNITQTY_ORDER = 1)
        and (OePo_Header.SHIPTO_ID like '%*B1')
        and(OePo_Item.CLOSED_FLG = 'N')
        and(OePo_Item.INVOICED_COUNT = 0)
        and(OePo_Item.ITEM_TYPE = '2')
        and(OePo_Item.vendOR_ID <> 'WHSE')
    )
group by
    LTRIM(RTRIM(OePo_Header.PO_ID)),LTRIM(RTRIM(OePo_Header.CLIENT_ID)),'B1',if(TEXT = Null,'',TEXT),OEPO_HEADER.PO_ID
order by
    OEPO_HEADER.PO_ID;

select
    OePo_Remarks.TEXT as POHI_COMMNT
from (
    OePo_Remarks
    inner join OePo_Header
    on OePo_Remarks.AUTOKEY = OePo_Header.WHSE_INST_ID
    and OePo_Remarks.PO_ID = OePo_Header.PO_ID
    )
where
    OePo_Remarks.PO_ID like '%208672%' -- fill in with appropriate PO num from outer code,208672 is just an example. (PO_IDs can be padded,hence the %s)
    OePo_Remarks.zflags like '%w%'

与将数据合并到调用两个查询代码中不同,我将如何设置一个查询,该子查询使用外部查询中的数据来获取所需的内容?像这样:

select
    ' ' as POHI_ACD,-- subquery start
    ( select
        OePo_Remarks.TEXT
    from (
        OePo_Remarks
        inner join OePo_Header
        on OePo_Remarks.AUTOKEY = OePo_Header.WHSE_INST_ID
        and OePo_Remarks.PO_ID = OePo_Header.PO_ID
        )
    where (
        OePo_Remarks.PO_ID like CONCAT('%',POHI_PONUM,'%') -- Here is where I need the correct PONUM from the outer query.
        and OePo_Remarks.zflags like '%w%'
        )
    ) as POHI_COMMNT,--subquery end
    ' ' as POHI_CUSER,if(OePo_Remarks.TEXT = Null,OePo_Remarks.TEXT),OePo_Header.PO_ID
order by
    OePo_Header.PO_ID;

使用效率低得多的单个查询,我可以在单个查询获取所需的数据,但是在此查询中执行需要花费几分钟,并且在查找相似的单独查询中,它可能需要更长的数量级(但不完全相同)数据。有没有办法使此变量起作用? (除非存在join组合,这样我才能在不到几分钟的时间内收集正确的数据?)

解决方法

您将需要默认装入一组列值以使其匹配,但我会尝试使用并集使两个选择作为单个结果集出现。在我的经验中,找到两个更简单的查询组合成一个联合体比一个复杂的查询要快很多。