簡體   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