通过 SQL 查询安全地标准化数据

2024-07-04

假设我有一张客户表:

CREATE TABLE customers (
    customer_number  INTEGER,
    customer_name    VARCHAR(...),
    customer_address VARCHAR(...)
)

这张表确实not有一个主键。然而,customer_name and customer_address should对于任何给定的都是唯一的customer_number.

该表包含许多重复客户的情况并不罕见。为了避免这种重复,使用以下查询来仅隔离唯一客户:

SELECT
  DISTINCT customer_number, customer_name, customer_address
FROM customers

幸运的是,该表传统上包含准确的数据。也就是说,从来没有发生过冲突customer_name or customer_address对于任何customer_number。然而,假设表中确实出现了冲突的数据。我希望编写一个会失败的查询,而不是返回多行customer_number有问题。

例如,我尝试了这个查询但没有成功:

SELECT
  customer_number, DISTINCT(customer_name, customer_address)
FROM customers
GROUP BY customer_number

有没有办法使用标准 SQL 编写这样的查询?如果没有的话,Oracle特定的SQL有解决方案吗?

编辑:奇怪的查询背后的基本原理:

说实话,这个客户表实际上并不存在(谢天谢地)。我创建它是希望它能够足够清晰地展示查询的需求。然而,基于该示例,人们(幸运的是)意识到对此类查询的需求是我最不用担心的。因此,我现在必须剥离一些抽象概念,并希望恢复我提出如此令人厌恶的桌子的声誉......

我从外部系统收到一个包含发票(每行一张)的平面文件。我逐行读取该文件,将其字段插入到该表中:

CREATE TABLE unprocessed_invoices (
    invoice_number   INTEGER,
    invoice_date     DATE,
    ...
    // other invoice columns
    ...
    customer_number  INTEGER,
    customer_name    VARCHAR(...),
    customer_address VARCHAR(...)
)

正如您所看到的,从外部系统到达的数据是非规范化的。也就是说,外部系统在同一行上包含发票数据及其关联的客户数据。多张发票可能共享同一客户,因此可能存在重复的客户数据。

在保证所有客户都在系统中注册之前,系统无法开始处理发票。因此,系统必须识别唯一客户并根据需要对其进行注册。这就是我想要查询的原因:因为我正在处理非规范化的数据,我无法控制.

SELECT
  customer_number, DISTINCT(customer_name, customer_address)
FROM unprocessed_invoices
GROUP BY customer_number

希望这有助于澄清问题的初衷。

编辑:好/坏数据的示例

澄清:customer_name and customer_address只需要独一无二对于一个特定的customer_number.

 customer_number | customer_name | customer_address
----------------------------------------------------
 1               | 'Bob'         | '123 Street'
 1               | 'Bob'         | '123 Street'
 2               | 'Bob'         | '123 Street'
 2               | 'Bob'         | '123 Street'
 3               | 'Fred'        | '456 Avenue'
 3               | 'Fred'        | '789 Crescent'

前两行很好,因为它是相同的customer_name and customer_address for customer_number 1.

中间两行很好,因为它是相同的customer_name and customer_address for customer_number2(尽管另一个customer_number有相同的customer_name and customer_address).

最后两行是not okay因为有两个不同的customer_addresses for customer_number 3.

如果针对所有六行运行,我正在查找的查询将会失败。但是,如果实际上只存在前四行,则视图应返回:

 customer_number | customer_name | customer_address
----------------------------------------------------
 1               | 'Bob'         | '123 Street'
 2               | 'Bob'         | '123 Street'

我希望这能澄清我所说的“冲突”的含义customer_name and customer_address“。它们必须是独一无二的customer_number.

我很欣赏那些解释如何正确从外部系统导入数据的人。事实上,我已经在做其中的大部分了。我故意隐藏了我正在做的所有细节,以便更容易专注于手头的问题。此查询并不是唯一的验证形式。我只是认为这会起到很好的画龙点睛作用(可以说是最后的防御)。这个问题只是为了调查 SQL 的可能性。 :)


你的方法有缺陷。您不希望成功存储的数据在选择时抛出错误 - 这是一个等待发生的地雷,意味着您永远不知道选择何时会失败。

我建议您向表中添加一个唯一的键,然后慢慢开始修改您的应用程序以使用该键,而不是依赖于有意义数据的任何组合。

然后,您就可以不再关心重复数据,因为这些数据本来就不是真正重复的。两个同名的人完全有可能共享同一个地址。

您还将通过这种方法获得性能改进。

顺便说一句,我强烈建议您标准化数据,即将名称分解为 FirstName 和 LastName(也可以选择 MiddleName),并将地址字段分解为每个组件的单独字段(Address1、Address2、City、State、Country) 、邮政编码或其他)

Update:如果我正确理解您的情况(我不确定我是否理解),您希望防止表中出现重复的名称和地址组合(即使这在现实生活中可能发生)。最好通过对这两个字段设置唯一约束或索引来防止插入数据。也就是捕获错误before你插入它。这将告诉您导入文件或生成的应用程序逻辑很糟糕,然后您可以选择采取适当的措施。

我仍然认为,当你查询时抛出错误已经太晚了,无法采取任何措施。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过 SQL 查询安全地标准化数据 的相关文章

  • 如何在 SQL Server 中使用 OPENQUERY 设置变量

    我正在尝试从表中读取数据 该表有一个表名列表 对于数据集的每一行 我想运行几个查询来提取数据并将其插入到临时表中 这是我所做的 DECLARE campName varchar 255 DECLARE sqlCommand varchar
  • 实体框架代码优先多列外键

    首先使用代码我设计了 3 个类 class User public Int32 ID get set public virtual ICollection
  • 查找生成森林(使用递归,PostgreSQL 9.5)

    我有一张桌子identities 即别名 适用于任意数量的人 每行都有一个以前的名称和一个新名称 在生产中 大约有 1 M 行 例如 id old new 1 Albert Bob 2 Bob Charles 3 Mary Nancy 4
  • 在 SQL Server 2008 R2 中引用前一行值进行算术计算

    我正在使用 SQL Server 2008 R2 并且是关系数据库的新手 我需要运行一个简单的计算 但计算涉及使用前一行的值 Example Value of X Value of Y at time t Value of Y at tim
  • 使用 MySQL 变量选择分层数据

    我有一个表 用于存储目录信息 就像在文件系统中一样 每个目录 命名节点 都有一个nodeid and a parentid 我想尽可能有效地检索完整路径 为此 我试图使以下查询起作用 但这些查询仅返回第一个预期行 实际上是最内部的目录 任何
  • 处理php中表单的多个输入

    我想知道如何处理具有多个属性的表单的多个输入 此代码生成我的字段
  • 在 postgres 函数中返回 select * 结果

    我正在尝试在 postgres 函数中返回查询结果 我尝试了这个并且工作得很好 CREATE OR REPLACE FUNCTION getIncomingAreaMovements v1 integer RETURNS integer A
  • 在 postgres 函数中返回 select * 结果

    我正在尝试在 postgres 函数中返回查询结果 我尝试了这个并且工作得很好 CREATE OR REPLACE FUNCTION getIncomingAreaMovements v1 integer RETURNS integer A
  • 用户定义函数性能缺点

    我有一个包含大量 UDF 的数据库 其中包含一个长时间运行的进程 涉及大量数据操作和计算 我使用 UDF 的想法是将信息的逻辑单元从底层表中分离出来 例如 如果我想获取有关汽车的信息 我可能有几个表 例如颜色 型号 年份等 每次获取汽车时我
  • 用户定义函数性能缺点

    我有一个包含大量 UDF 的数据库 其中包含一个长时间运行的进程 涉及大量数据操作和计算 我使用 UDF 的想法是将信息的逻辑单元从底层表中分离出来 例如 如果我想获取有关汽车的信息 我可能有几个表 例如颜色 型号 年份等 每次获取汽车时我
  • C# 使用 SqlCommand.Parameters 更新表

    我正在尝试使用 Sql 命令更新 SQL 表 我认为这是我的 T SQL 的语法错误 但这是我到目前为止所得到的 SqlCommand sqlCmd new SqlCommand UPDATE yak tickets SET email e
  • Postgres 查询包含某些内容的 JSON 数组

    Postgres 有这种 JSON 数据类型 我想知道如何查询 JSON 数组内的数据 我正在使用 Postgres 9 3 1 我已插入 PUBLISHER 表 该表具有这 2 个字段名称 字符串和数据 json INSERT INTO
  • oracle sql中的group by表达式的内连接[重复]

    这个问题在这里已经有答案了 我是 sql 新手 感谢任何帮助 我有两张桌子 employees and jobs employees包含一个变量job id 多个员工可以具有相同的 job ID jobs包含变量job id and job
  • java.sql.SQLException:使用 IN 运算符时出现数字溢出

    我实现了一个 Java 应用程序 它使用以下查询根据给定的 id 集查询数据库 select from STUDENT where ID in 该组 id 将用于替换 但是 有时我会收到异常 Caused by java sql SQLEx
  • 除了结构化 XML 数据之外,还选择行数据

    我知道如何将 XML 变量连接到其他表 但在本例中 我尝试从表中选择每一行以及 XML 的结构从每个相应的表行 在那一行旁边 我无法在网上找到任何示例来帮助解决此问题 因为大多数示例都处理单个 XML 值 抱歉 如果有的话 我无法在无数其他
  • SQL Loader 脚本帮助添加 SYSDATE、USER

    我正在尝试从文件加载数据 并且想将 CREATED DATE 和 UPDATED DATE 设置为 SYSDATE 将 CREATE BY 和 UPDATED BY 设置为 USER 这是我正在使用的表 CREATE TABLE CATAL
  • 我可以在商业应用程序中使用免费的 SQL Server Express [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 通过 SQL 查询安全地标准化数据

    假设我有一张客户表 CREATE TABLE customers customer number INTEGER customer name VARCHAR customer address VARCHAR 这张表确实not有一个主键 然而
  • 对多个表进行排序 MYSQL DateStamp

    我正在构建一个简单的买卖网站 并希望在第一页上列出最新的广告 在我的数据库中有 4 个表 USERS CARS ELECTRONICS and COMPUTERS 三个项目表中的每一个 CARS ELECTRONICS and COMPUT
  • 使用 dbt 中的星形宏获取列名称和类型

    使用星形宏 除了列名之外 有没有办法还获取列数据类型 布尔值 数值等 例如 此查询使用星号宏从引用表中收集列名 并将其保存为数组变量column names 然后循环该数组并将 max 函数应用于所有列 set column names s

随机推荐

  • 如何在多线程中使用spring事务

    我有一个方法如下 ClassA java Transactional public void methodA ExecutorService executorService Executors newFixedThreadPool 4 ex
  • Android ShapeDrawable 以编程方式设置背景和边框

    我有一个ShapeDrawable final ShapeDrawable drawable new ShapeDrawable shape drawable getPaint setStyle Paint Style FILL drawa
  • 如何找到循环矩阵何时收敛

    我得到了一个矩阵 P lt matrix c 0 0 0 0 5 0 0 5 0 1 0 1 0 0 4 0 0 4 0 0 2 0 2 0 3 0 0 3 0 0 0 3 0 5 0 0 2 0 0 0 0 4 0 6 0 0 0 0 0
  • 适合初学者的基于 Java 的 Web 应用程序框架

    我有一位新同事需要一些有关用 Java 开发 Web 应用程序的教育 他有基本的 Java 知识 但几乎没有 Web 应用程序经验 我们的标准工具堆栈基于 Wicket JPA 和 Spring 但我担心这会让我们的新同事过度收费 现在我正
  • Android 上的 DGPS 校正

    我正在开发一个项目 旨在利用 Android 手机和附近站点的 GPS 功能 使用 RTK DGPS 技术来计算更精确的定位 厘米 到目前为止 我还没有看到有人说他们实际上成功地执行了类似的任务 除了 GPSmaster 谁不解释一下如何
  • ORA-06502: PL/SQL: 数字或值错误: C# 代码中的字符串缓冲区太小异常

    我正在尝试使用来自 asp net 上的 code 的 in 和 out 参数执行一些 oracle pl sql 过程 我想从 out 参数中检索值 但是当我执行时 我收到一个oracle异常 如 ORA 06502 PL SQL 数字或
  • 用 R 中的 ggplot2 填充两条线之间的区域

    这是一个玩具数据集 xa lt c 4 5 4 5 4 3 1 5 ya lt c 1 2 4 5 5 5 6 xb lt c 3 8 4 5 4 3 5 2 5 1 yb lt c 1 2 3 4 5 5 8 toyset lt as d
  • 尝试重复键插入时抛出的正确异常?

    我多次看到关于避免抛出泛型的评论RuntimeException我正在努力遵循该指导方针 我有一个类聚合了SortedMap具有允许或禁止重复键的属性设置 我试图找出当不允许重复键并尝试添加一个时应该抛出什么异常 我检查了 Java 文档E
  • Promise 是做什么的?

    我正在关注 Stephen Grinder 教程 他开始使用 Promisify 为此他给出了非常模糊的解释 说redis需要一个回调函数 他发现非常不整洁 redis不支持NodeJS中的promise 然后他做了这样的事情 const
  • 在 WPF MVVM 中绑定图像

    我在将图像绑定到我的视图模型时遇到一些问题 我终于摆脱了 XamlParseException 但图像没有出现 我什至在 ViewModel 中对图像进行了硬编码 有人能看到我做错了什么吗 View
  • Spotify 会话管理

    我在我的应用程序中有一个 Spotify 登录并尝试进行自动登录 登录功能 func getSpotifyToken fromController controller UIViewController success spotifyTok
  • 如何使用curl访问Twitter REST API v1.1?

    使用 测试 OAuth 功能 应用程序设置 我可以为指定的 API 请求生成完全设置的curl 命令 curl get https api twitter com 1 1 followers ids json data count 10 c
  • 如何在 Javascript 中的警报/确认框中显示图像?

    如何在警告框或确认框显示图像 我一直在尝试使用下面的代码 但在警报框中获取图像网址 请任何人帮助我解决问题 或者如果不可能 请给出任何其他建议 var image document getElementById myImage src ha
  • Jython 的 Pylint 入门 (jython2.5.1)

    我们有大量用于部署自动化的 Jython 脚本 我希望 Pylint 成为我们构建管道的一部分 我从这里下载并安装了 logilab astng logilab common 和 pylint http www logilab org 85
  • 如何从头开始编写 JPEG 文件解码器

    我知道已经有很多工具可以做到这一点 我的目标是学习 所以我可以使用 fopen 读取 JPEG 文件 我知道这是一个二进制文件 然后呢 我知道我可以学习 JPEG 规范 但它似乎并没有告诉二进制jpeg文件的结构是什么 该文件包含零和一 我
  • 将字典列表转换为 Pandas 数据框

    我有一个Python列表dict每个都有相同的密钥 dict keys k1 k2 k3 k4 k5 k6 More like 30 keys in practice data for i in range 20 More like 300
  • 使用 FOR XML 从 SQL Server 2008 R2 返回空或 null 字段作为

    我正在使用 SQL Server 2008 R2 运行查询FOR XML PATH 我唯一的问题是我希望所有元素都出现 即使它们是 NULL 并且我希望空 或 null 元素返回为
  • 在 WooCommerce 的电子邮件和订单页面中保存和显示产品自定义数据

    我正在使用一些代码来添加自定义字段 以使我的客户能够自定义他们的产品 这是我当前的代码 Add meta fields to all products SRC https wisdmlabs com blog add custom data
  • 黑莓中的 Twitter 集成:登录页面不是英文

    我正在尝试使用集成 TwitterTwitter API 我 1 8 http kenai com projects twitterapime downloads 当我尝试使用 OAuth 授权时 登录屏幕如下所示 显示一些无效字符 请帮助
  • 通过 SQL 查询安全地标准化数据

    假设我有一张客户表 CREATE TABLE customers customer number INTEGER customer name VARCHAR customer address VARCHAR 这张表确实not有一个主键 然而