【问题标题】:Order by a column in child table without fetching data from the child table按子表中的列排序而不从子表中获取数据
【发布时间】:2020-11-13 04:40:29
【问题描述】:

我有一个游标,我可以在其中检索数据以执行 FOR 循环。在游标的 select 语句中,我想按子表中的列排序,但是我不想从子表中获取数据。

我尝试使用连接,但子表中的数据也被提取到游标。我完全同意拥有执行订单的数据是有意义的。我不确定这是否可行,但真的很期待解决方案。

我的场景示例。

CURSOR get_items_cursor_(rev_code_ IN VARCHAR2) IS
      SELECT *
      FROM   items_table
      WHERE  code = rev_code_ ;

上面是我的 FOR 循环中使用的简单光标。

上表显示了 items_table 中的示例数据

我想从子表 part_items_table 的 is_original 列中订购这些数据

上图显示了子表中的数据。

在上面的光标中,我想使用 item_id 列加入数据,并首先按 is_original TRUE 列排序。但是我不想从子表中获取数据到 CURSOR。

我已经尝试了以下

SELECT * FROM 
item_table item
INNER JOIN item_part_table item_part ON item.item_id =item_part.item_id
ORDER BY item_part.is_original DESC

上面的 select 语句也显示了子表中的数据。从逻辑上讲,连接应该显示来自子表的数据,但在我的场景中,我只想使用子表列对上表进行排序。

任何帮助将不胜感激。

谢谢

【问题讨论】:

  • SELECT item.* FROM ...
  • 是否有可能在 ITEM_PART_TABLE 中重复 ITEM_ID,其中一个值为 IS_ORIGINAL = TRUE,而另一个值为 IS_ORIGINAL = FALSE?如果是 - 您希望看到哪个 ITEM_TABLE 值?
  • 只选择您需要的列。这在使用游标时总是是正确的——尽管你是否真的需要一个游标来实现你想要实现的逻辑是值得怀疑的。
  • @gogocho item_part_table 中的 item_id 可以重复,一个 is_original 为 true,另一个为 false。我想同时显示两者,但我想先选择 true 的记录。
  • @HarryManoharan - 因此,如果您在 ITEM_ID 的 PART_ITEMS_TABLE 中有两个 IS_ORIGINAL 值,您希望在结果中两次显示 ITEM_TABLE 中的 ITEM_ID、REV_CODE、ASSM_CODE、SLOT_CODE、ITEM_CODE 的相同值?但按子表中的某些列排序。如果我们在 PART_ITEMS_TABLE 中有三倍的 ITEM_ID?预计会出现 3 次相同的结果?

标签: sql oracle


【解决方案1】:

您可以加入,但只选择您想要的列,如下所示:

所以我只选择 item_table 列,唯一的问题是您将有重复并且您不能使用 distinct 因为选择列表中没有的顺序,这就是它给您错误的原因

SELECT DISTINCT item.* 
FROM 
   item_table item
INNER JOIN item_part_table item_part 
   ON item.item_id =item_part.item_id
ORDER BY 
   item_part.is_original DESC

【讨论】:

  • 执行上述查询时出现错误“ORA-01791: not a SELECTed expression”。
【解决方案2】:

您可以从 select 子句中删除* 并使用item.*item_part.is_original,如下所示:

SELECT item.*, item_part.is_original FROM 
item_table item
INNER JOIN item_part_table item_part ON item.item_id =item_part.item_id
ORDER BY item_part.is_original DESC

【讨论】:

  • 但是这种方式也会从 item_part_table 中选择我不想要的记录。
【解决方案3】:

根据您的 cmets,请尝试以下代码:

select item_id, rev_code, assm_code,slot_code, item_code
from
    (
        select
            c.*,
            row_number() over (partition by c.item_id order by p.is_original desc) as r_num,
            decode(p.is_original, 'TRUE', 1, 2) as ord_num
        from
            item_table c join part_items p on (p.item_id = c.item_id)
    )
where r_num = 1
order by ord_num;

谢谢。

【讨论】:

    猜你喜欢
    • 2016-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-06
    相关资源
    最近更新 更多