【问题标题】:SQL join over same tableSQL连接同一张表
【发布时间】:2016-11-27 11:25:02
【问题描述】:

  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 是 VALID 还是 INVALID 的 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 记录。

我要找的结果是

【问题讨论】:

  • 您对架构(即索引)有任何控制权吗?
  • @Anthony:不,我没有。但我可以知道你为什么问这个。如果我有怎么办。
  • AND VALID_INVALID = 'VALID' 放在主 WHERE 子句中的 DATE 之后还不够吗?你会忽略其他一切。
  • 您的结果中有 INVALID 但仅在 #5 中声明 VALID
  • 我会做出有问题的更正。真正的问题是如何在这些 MAT 记录中获取 ITEM_ID。

标签: mysql sql oracle join query-optimization


【解决方案1】:

试试这个,如果没有帮助请告诉我

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'

【讨论】:

  • 这个查询也有效。只有我必须添加额外的条件来删除重复的记录。谢谢。
【解决方案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 结果,则您需要更改为左连接。

【讨论】:

  • 抱歉,自动更正咬了我几次把 vals 变成 vans,不得不回去整理它们。
  • 谢谢.. 我在加入时收到重复记录。
  • 81200 MAT 3001 有效 81200 MAT 3001 有效 81200 MAT 3002 有效 81200 MAT 3002 有效 97800 MAT 7005 无效 97800 MAT 7005 无效
  • 我得到了多条记录,因为我有多个 JOB_DATE 的相同合法 ID 记录。添加 JOB_DATE 条件后它起作用了。谢谢。
【解决方案3】:
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;

这肯定会起作用;)

【讨论】:

    猜你喜欢
    • 2017-07-17
    • 2017-07-27
    • 2015-02-26
    • 1970-01-01
    • 2011-09-30
    • 2021-09-30
    • 2023-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多