SQL连接在同一个表上

时间:2016-07-23 18:55:21

标签: mysql sql oracle join query-optimization

enter image description here

  1. 表ORDER_ITEM只有两种类型的记录。 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为VALID或INVALID的ITEM_ID。因为JOB_DATE的表格可能很大。我们想把它放在缓存中。
  6. 我试过这样的事情。没有优化。但这也没有给出预期的结果。记录的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'
                                           )
                       )
    ;
    

    我可以在同一个表上使用LEFT / RIGHT外连接获得结果,或者我需要应用编程来获得结果。

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

    我要找的结果是enter image description here

3 个答案:

答案 0 :(得分:3)

试试这个,让我知道如果没有帮助

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'

答案 1 :(得分:2)

我认为这会根据您描述的要求提取结果(使用可选的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结果,则需要更改为该连接。

答案 2 :(得分:0)

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;

这肯定会起作用;)