Oracle SQL 查找具有不同值的列
Oracle SQL find columns with different values
我有两个 tables A 和 B,都有几百万行和大约一百列。
我想找出哪些列有不同的观察结果,而不需要列出所有列的名称。
例如,假设列 ID
是两个 table 中的主键。而那个 table A 是
ID | col1 | col2
----------------
1 | 123 | 101
2 | 456 | 111
而 table B 是
ID | col1 | col2
----------------
1 | 123 | 101
2 | 456 | 222
我的查询结果大约是 col2
。如果 table 基于观察形成塔布拉 A 或 B 或其他什么,我无所谓。我希望在查询中避免列出所有列,因为它们很多。我对知道其列具有不同值的行不感兴趣,只对列感兴趣。
编辑:
考虑这些假设:
首先,假设两个table中的列具有相同的名称。我更喜欢没有这个假设的东西,但我非常满意。
其次,table的列只是数字。同样,假设这是为了简化。
谢谢!
我从一位同事那里得到了答案,我认为值得为未来的用户发布。他在 TABLE_A
和 TABLE_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;
/
我有两个 tables A 和 B,都有几百万行和大约一百列。
我想找出哪些列有不同的观察结果,而不需要列出所有列的名称。
例如,假设列 ID
是两个 table 中的主键。而那个 table A 是
ID | col1 | col2
----------------
1 | 123 | 101
2 | 456 | 111
而 table B 是
ID | col1 | col2
----------------
1 | 123 | 101
2 | 456 | 222
我的查询结果大约是 col2
。如果 table 基于观察形成塔布拉 A 或 B 或其他什么,我无所谓。我希望在查询中避免列出所有列,因为它们很多。我对知道其列具有不同值的行不感兴趣,只对列感兴趣。
编辑:
考虑这些假设:
首先,假设两个table中的列具有相同的名称。我更喜欢没有这个假设的东西,但我非常满意。
其次,table的列只是数字。同样,假设这是为了简化。
谢谢!
我从一位同事那里得到了答案,我认为值得为未来的用户发布。他在 TABLE_A
和 TABLE_B
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;
/