Oracle SQL查找具有不同值的列



我有两个表A和B,它们都有数百万行和大约100列。

我想找到哪些列有不同的观测值,而不需要列出所有列的名称。

例如,假设列ID是两个表中的主键。表格A是

ID | col1 | col2
----------------
1  | 123  | 101
2  | 456  | 111

而表B是

ID | col1 | col2
----------------
1  | 123  | 101
2  | 456  | 222

我的查询结果将是关于col2的一些东西。如果一个表格是基于表格a或B的观察结果,我都无所谓。我想在查询中避免列出所有列,因为它们很多。我对知道哪些行的列有不同的值不感兴趣,只对列感兴趣。

编辑:

考虑这些假设:

  • 首先,假设两个表中的列具有相同的名称。我更喜欢没有这种假设的东西,但我对它非常满意。

  • 第二,表的列只能是数字。同样,假设这是为了简化。

谢谢!

我从一个同事那里得到了答案,我认为值得把它贴出来供将来的用户使用。他在两个表TABLE_ATABLE_B上使用PL/SQL和循环

SET SERVEROUTPUT ON SIZE 10000
DECLARE
v_sql_text     VARCHAR2(300);
n_contador     NUMBER;
n_contador_2   NUMBER;
BEGIN
FOR x IN (
SELECT
column_name
FROM
user_tab_columns
WHERE
table_name IN (
'TABLE_A'
)
) LOOP
v_sql_text := 'SELECT /*+ PARALLEL 32 */ count(1) FROM (SELECT DISTINCT('
|| x.column_name
|| ') FROM TABLE_A MINUS SELECT DISTINCT('
|| x.column_name
|| ') FROM TABLE_B)';
EXECUTE IMMEDIATE v_sql_text
INTO n_contador;
v_sql_text := 'SELECT /*+ PARALLEL 32 */ count(1) FROM (SELECT DISTINCT('
|| x.column_name
|| ') FROM TABLE_B MINUS SELECT DISTINCT('
|| x.column_name
|| ') FROM TABLE_A)';
EXECUTE IMMEDIATE v_sql_text
INTO n_contador_2;
IF n_contador != 0 OR n_contador_2 != 0 THEN
dbms_output.put_line(x.column_name || ' is different');
END IF;
END LOOP;
END;
/

相关内容

  • 没有找到相关文章

最新更新