如何在 Netezza 中根据主键生成 GROUP BY 脚本
Posted
技术标签:
【中文标题】如何在 Netezza 中根据主键生成 GROUP BY 脚本【英文标题】:How to generate GROUP BY script based on priamry key in Netezza 【发布时间】:2016-05-02 19:24:38 【问题描述】:在 Netezza 中,不强制执行主键。线程How to overcome Netezza's lack of unique constraint/referential integrity enforcement?回答了如何写入存储过程来强制执行。
在我们的例子中,我们不想使用存储过程来强制执行它,因为它会破坏我们的加载。相反,我们每月检查我们的数据库完整性以查找潜在的重复项。我们需要一个脚本来帮助我们为所有表生成以下查询:
SELECT PK1, PK2, COUNT(*)
FROM TABLENAME
GROUP BY PK1, PK2 HAVING COUNT(*)>1
LIMIT 100;
【问题讨论】:
How to overcome Netezza's lack of unique constraint/referential integrity enforcement?的可能重复 没有。它不是重复的。您提到的一个是使用存储过程来强制执行主键。我的问题是查询生成器。 也许,但答案是完全一样的。为了强制执行主键,您必须找到重复项,这正是该问题的答案。 【参考方案1】:以下答案使用我另一篇帖子https://***.com/a/36989929/4266330的知识
下面的脚本会返回你想要的结果
SELECT 'SELECT '||GROUP_BY_COLS||', COUNT(*)'||CHR(13)||
' FROM '||SCHEMA||'.'||TABLENAME||CHR(13)||
' GROUP BY '||GROUP_BY_COLS||' HAVING COUNT(*)>1'||CHR(13)||
' LIMIT 100;'
FROM (
SELECT
R.SCHEMA AS SCHEMA
,R.NAME AS TABLENAME
,TOOLKIT.SQLEXT.REGEXP_REPLACE(TOOLKIT.SQLEXT.GROUP_CONCAT('@'||LPAD(K.CONSEQ, 4, '0')||'@'||K.ATTNAME, ', '),
'@[0-9]4@', '') AS GROUP_BY_COLS
FROM _V_RELATION_COLUMN R
JOIN _V_RELATION_KEYDATA K
ON (R.SCHEMA=K.SCHEMA
AND R.NAME=K.RELATION
AND R.ATTNAME=K.ATTNAME)
WHERE K.CONTYPE='p'
GROUP BY 1, 2
) S;
示例结果:
选择 IDP_EFFECTIVE_DATE、ACCOUNT_ID、COUNT(*) 来自 AAA.L1_ACCOUNTS GROUP BY IDP_EFFECTIVE_DATE, ACCOUNT_ID HAVING COUNT(*)>1 限制 100; SELECT DEAL_NUM, COUNT(*) FROM ABUHARI.L1_BMO16_BOOST_EXTRACT_TOR GROUP BY DEAL_NUM HAVING COUNT(*)>1 限制 100; 选择 IDP_WAREHOUSE_ID、IDP_AUDIT_ID、ACCOUNT_KEY、COUNT(*) FROM ACTIMIZE.L1_ACTIMIZE_US12_ACCOUNT GROUP BY IDP_WAREHOUSE_ID、IDP_AUDIT_ID、ACCOUNT_KEY HAVING COUNT(*)>1 限制 100;【讨论】:
以上是关于如何在 Netezza 中根据主键生成 GROUP BY 脚本的主要内容,如果未能解决你的问题,请参考以下文章
Group By 的基本 SQL 问题(在 Netezza 中)
在 IBM netezza sql server 中创建唯一的主键?