繁体   English   中英

SQL在同一表上联接

[英]SQL join over same table

在此处输入图片说明

  1. 表ORDER_ITEM只有2种记录类型。 ORDER_TYPE MAT和VAL
  2. 使用ORDER_TYPE MAT的记录没有ITEM_ID
  3. 具有ORDER_TYPE VAL的记录始终具有ITEM_ID
  4. VAL和MAT之间的链接为ORDER_ID。 表示一个ORDER_ID可以有多个VAL,但可以有一个MAT。
  5. 我需要找出ORDER_TYPE MAT的有效或无效的ITEM_ID。 由于该表在JOB_DATE可能很大。 我们要把它放在缓存中。

我尝试过这样的事情。 没有优化。 但这也无法获得预期的结果。 记录的ITEM_ID为空。

select * 
from   ORDER_ITEM
where  ORDER_TYPE = 'MAT' 
  and  JOB_DATE = '7/22/2016'
  and  ORDER_ID in (
                     select ORDER_ID
                     from   ORDER_ITEM 
                     where  ITEM_ID in (
                                         select ITEM_ID
                                         from   ORDER_ITEM 
                                         where  JOB_DATE = '7/22/2016'
                                            and ORDER_TYPE = 'VAL'
                                       )
                   )
;

我可以在同一张表上使用左/右外部联接获取结果,还是需要应用编程来获取结果。

我需要找到填充了ITEM_ID的MAT记录。

我正在寻找的结果是 在此处输入图片说明

试试这个,让我知道是否有帮助

select 
    mat.ORDER_ID, mat.ORDER_TYPE,val.ITEM_ID,val.VALID_INVALID 
from ORDER_ITEM mat 
    inner join ORDER_ITEM val 
        on mat.ORDER_ID = val.ORDER_ID
where mat.ORDER_TYPE='MAT' and val.ORDER_TYPE='VAL'

我认为这会根据您所描述的要求拉出结果(通过可选的order by来获得与示例结果相同的排序):

select mats.order_id, mats.order_type, vals.item_id, mats.valid_invalid
from order_item mats 
join order_item vals
on (mats.order_id = vals.order_id 
    and mats.order_type = 'MAT' 
    and vals.order_type = 'VAL')
order by mats.order_id, vals.item_id;

关于任何左联接,如果您也有没有对应的VAL记录的任何MAT条目,并且仍然想检索那些MAT结果,则希望更改为该联接。

SELECT
    OI1.itemid,
    OI1.order_id,
    OI2.valid_invalid
FROM OI OI1
INNER JOIN (
    SELECT
        order_id,
        valid_invalid
    FROM OI
    WHERE   Order_type = 'MAT'
) OI2 ON OI1.Order_ID = OI2.order_id
AND OI1.Itemid IS NOT NULL;

这肯定可以工作;)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM