【问题标题】:Obtain elements from a list which are not defined in table column从列表中获取未在表列中定义的元素
【发布时间】:2021-02-24 14:19:55
【问题描述】:

这里的挑战是我只对数据库进行了只读操作。我无法创建辅助/临时表来插入元素列表以进行比较。

我有一个 excel 中的元素列表,大约 300 个。我需要将此元素列表(字符串)与表格的列进行比较。

但我确实需要列表中未在列表中定义的元素。

我知道如何获取列表和元素列表中定义的元素。

select table.code from table
where table.code in (ele1, ele2, ...);

但我不知道如何获取未在表中定义的列表中的元素。

如果我可以创建一个临时表,我将使用 join 轻松完成这项工作。

【问题讨论】:

  • 不@Sal 任务,因为我理解它从excel 列表中获取代码MINUS 表中的代码
  • 你要在哪里运行这个 SQL,是从前端还是 PL/SQL 代码?您可以尝试创建一个字符串,将其用作动态 SQL 中的 WHERE 子句。

标签: sql oracle oracle-sqldeveloper


【解决方案1】:

解决您缺少的create table 权限的一种可能解决方案是使用集合

您必须使用您的 excel 代码初始化集合。

minus你的表中的代码集合中选择代码是一项微不足道的任务。

以下 PL/SQL 片段说明了它

declare
  my_excel_codes SYS.ODCIVARCHAR2LIST;
begin
  my_excel_codes := SYS.ODCIVARCHAR2LIST('A','B','C');
  
  for cur in (
    select COLUMN_VALUE code from  TABLE( my_excel_codes ) 
      minus
    select code from tab)  
  loop
     dbms_output.put_line(cur.code );
  end loop;
end;
/

这是基于相同原理的SQL解决方案

select column_value from table (
SYS.ODCIVARCHAR2LIST(
'A','B','C' -- your CSV code list here
))
MINUS
select code from tab;

它适用于 CSV 列表中最多 999 个代码。最多可以得到 1000 个元素 ORA-00939: too many arguments for function(在 18.4 XE 中测试)

【讨论】:

    【解决方案2】:

    您可以使用文本编辑器(例如 sublime)将 excel 转换为 CTE

    示例。取一个红黄绿白4行的excel文件

    并将其与颜色表进行比较:

    drop table colors;
    create table colors (color VARCHAR2(10));
    INSERT INTO colors (color) VALUES ('red'); 
    INSERT INTO colors (color) VALUES ('blue'); 
    INSERT INTO colors (color) VALUES ('white'); 
    
    -- this is the excel file values re-written as a CTE
    WITH my_excel_colors(color) AS
    (SELECT 'red' FROM DUAL UNION ALL
     SELECT 'yellow' FROM DUAL UNION ALL
     SELECT 'green' FROM DUAL UNION ALL
     SELECT 'white' FROM DUAL
    ) 
    SELECT color FROM my_excel_colors 
    MINUS 
    SELECT color FROM colors;
    
    

    【讨论】:

      【解决方案3】:

      老实说,对于一个小数据集,我只会在 Excel 中执行此操作。

      假设您现有的 Excel 字符串位于 A 列中。

      1. 运行select table.code from table
      2. 将结果集复制/粘贴到 Excel 的 B 列中
      3. 在 C 列中,将方程 =COUNTIF($B:$B, $A1) 放入 C1 并向下复制到整列
      4. 过滤 C 列为 0 的行

      【讨论】:

      • 是的,这是我用于小列表的解决方案。感谢您的想法。
      猜你喜欢
      • 2012-04-04
      • 1970-01-01
      • 2014-12-16
      • 1970-01-01
      • 2022-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多