SELECT 非规范化列到单独的记录中?

2024-01-06

我正在使用 SQL 一点,这样如果我在工作面试中被问到,我就不会完全不知道它。我的朋友最近在面试时被问到以下问题,他答不出来,我问了工作中熟悉 SQL 的人,他也不知道。你们能帮我回答这个问题,然后解释一下它是如何工作的吗?请?

*问题*

数据库规范化(或缺乏规范化)常常给开发人员带来挑战。

考虑一个包含三个字段的员工数据库表:

EmployeeID
EmployeeName
EmailAddresses

由唯一的 EmployeeID 标识的每位员工在 EmailAddresses 字段中可能有一个或多个以逗号分隔的 @rockauto.com 电子邮件地址。

数据库表定义如下:

CREATE TABLE Employees
(
  EmployeeID int UNSIGNED NOT NULL PRIMARY KEY,
  EmployeeName varchar(50) NOT NULL,
  EmailAddresses varchar(40) NOT NULL ,
  PRIMARY KEY(EmployeeID)
);

出于测试目的,以下是一些示例数据:

INSERT INTO Employees (EmployeeID, EmployeeName, EmailAddresses) VALUES
('1', 'Bill', '[email protected] /cdn-cgi/l/email-protection'),
('2', 'Fred', '[email protected] /cdn-cgi/l/email-protection,[email protected] /cdn-cgi/l/email-protection'),
('3', 'Fred', '[email protected] /cdn-cgi/l/email-protection'),
('4', 'Joe', '[email protected] /cdn-cgi/l/email-protection,[email protected] /cdn-cgi/l/email-protection');

您的任务是编写一个 MySQL SELECT 查询,该查询将显示上述示例数据的以下输出:

Employee    EmailAddress
Bill    [email protected] /cdn-cgi/l/email-protection
Fred (2)    [email protected] /cdn-cgi/l/email-protection
Fred (2)    [email protected] /cdn-cgi/l/email-protection
Fred (3)    [email protected] /cdn-cgi/l/email-protection
Joe     [email protected] /cdn-cgi/l/email-protection
Joe     [email protected] /cdn-cgi/l/email-protection

请注意,由于有多个同名人员(在本例中为“Fred”),因此 EmployeeID 包含在括号中。

您的查询需要使用 MySQL 版本 5.1.41 兼容语法编写。您应该假设排序是使用标准数据库升序完成的:“ORDER BY EmployeeID ASC”

对于此问题,您需要提交单个 SQL SELECT 查询。您的查询应该能够在合理的时间内处理包含 1000 条记录的表。


仅当您的电子邮件少于 10000 封时...可以接受吗?

select 
       if(t1.c > 1, concat(e.employeename, ' (', e.employeeid, ')'), e.employeename) as Employee,
       replace(substring(substring_index(e.EmailAddresses, ',', n.row), length(substring_index(e.EmailAddresses, ',', n.row - 1)) + 1), ',', '') EmailAddress 
from 
       (select employeename, count(*) as c from Employees group by employeename) as t1, 
       (select EmployeeID, length(EmailAddresses) - length(replace(EmailAddresses,',','')) + 1 as emails from Employees) as t2,
       (SELECT @row := @row + 1 as row FROM 
       (select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) x,
       (select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) x2, 
       (select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) x3, 
       (select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) x4, 
       (SELECT @row:=0) as ff) as n,
       Employees e
where 
      e.employeename = t1.employeename and
      e.employeeid = t2.employeeid and
      n.row <= t2.emails
order by e.employeeid;

EDIT:

生成的无用数字更少:

select 
       if(t1.c > 1, concat(e.EmployeeName, ' (', e.EmployeeID, ')'), e.EmployeeName) as Employee,
       replace(substring(substring_index(e.EmailAddresses, ',', n.row), length(substring_index(e.EmailAddresses, ',', n.row - 1)) + 1), ',', '') as EmailAddress 
from 
       (select EmployeeName, count(*) as c from Employees group by EmployeeName) as t1, 
       (select EmployeeID, length(EmailAddresses) - length(replace(EmailAddresses,',','')) + 1 as emails from Employees) as t2,
       (select `1` as row from (select 1 union all select 2 union all select 3 union all select 4) x) as n,
       Employees e
where 
      e.EmployeeName = t1.EmployeeName and
      e.EmployeeID = t2.EmployeeID and
      n.row <= t2.emails
order by e.EmployeeID;

我们学到了什么?糟糕的数据库设计会导致糟糕的查询。你可以用 SQL 做一些事情,这可能只是因为人们的数据库设计很糟糕......:)

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

SELECT 非规范化列到单独的记录中? 的相关文章

  • MySql 查询在选择中将 NULL 替换为空字符串

    如何用空字符串替换 select 中的 NULL 值 输出 NULL 值看起来不太专业 这是非常不寻常的 根据我的语法 我希望它能够工作 我希望能得到一个解释 为什么没有 select CASE prereq WHEN prereq IS
  • 如何使用 PHP 从 MySQL 查询中按升序对值进行排序?

    我使用以下 PHP 脚本从 MySQL 表中获取和更改数据 并将结果打印在 HTML 表中 我希望按升序对数据进行排序 utilization percentage变量 它是由创建的 total client time total avai
  • 获取查询的行号

    我有一个查询将返回一行 当表排序时 有什么方法可以找到我正在查询的行的行索引吗 我试过了rowid但当我期待第 7 行时却得到了 582 Eg CategoryID Name I9GDS720K4 CatA LPQTOR25XR CatB
  • 执行许多插入重复键更新错误:未使用所有参数

    所以我一直在尝试使用 python 2 7 15 使用 mysql connector 执行此查询 但由于某种原因 它似乎不起作用并且总是返回错误 并非所有参数都被使用 表更新有一个主键 即 ID 这是我尝试运行此 SQL 的查询 sql
  • MySQL 触发器和 SUM()

    我有两张桌子 学生桌和家庭桌 在学生中 我有列 st venue 和total venue 家里我有收入 Total Revenue 是学生 st 收入与家庭收入之和 其中 family id student student id stud
  • php 崩溃后 mysql 表被锁定

    我有一个 MySQL DB 和一个 innoDB 表 我有一个 php 页面 用于连接 锁定表 进行一些更新 然后解锁表 PHP 页面通过 wamp 与 apache 一起提供 php页面将文件上传到数据库 我决定通过上传一个大小大于分配给
  • 物理写入文件已满 - mysql 错误

    我正在使用xampp 每次启动mysql时 我都会在xampp中收到以下错误 Error MySQL shutdown unexpectedly 13 16 14 mysql This may be due to a blocked por
  • 如何将自定义类型数组传递给 Postgres 函数

    我有一个自定义类型 CREATE TYPE mytype as id uuid amount numeric 13 4 我想将它传递给具有以下签名的函数 CREATE FUNCTION myschema myfunction id uuid
  • SQL Server 查询结果集的大小

    SQL Server 中是否有确定结果集中 Mgmt Studio 查询中返回的数据大小 以 MEGS 为单位 您可以打开客户端统计信息 查询菜单 包括客户端统计信息 它给出执行查询时从服务器返回的字节数
  • SQL - 为每条记录调用存储过程

    我正在寻找一种方法来为 select 语句的每条记录调用存储过程 SELECT SomeIds SELECT spro Id FROM SomeTable as spro INNER JOIN Address addr ON addr Id
  • 从 PDO 准备好的语句中获取原始 SQL 查询字符串

    在准备好的语句上调用 PDOStatement execute 时 有没有办法让原始 SQL 字符串执行 出于调试目的 这将非常有用 我假设您的意思是您想要最终的 SQL 查询 并将参数值插入其中 我知道这对于调试很有用 但这不是准备好的语
  • 如果执行没有事务的删除语句,是否会删除部分内容?

    如果表myTable包含100000000条记录 我执行DELETE FROM myTable 没有开始交易并且出现问题 例如服务器电源故障 会删除一些记录吗 否 如果数据库引擎符合ACID http en wikipedia org wi
  • SQL Server 相当于 MySQL 的 USING

    在 MySQL 中 当您连接不同表中具有相同名称的列时 可以在连接中使用关键字 USING 例如 这些查询产生相同的结果 SELECT FROM user INNER JOIN perm USING uid SELECT FROM user
  • Laravel Group By 和 Order By 不起作用

    我尝试制作一个Laravel 5 8项目 项目中的数据是这样的 id purch name prcvalue 1 10234 Nabila 100 2 10234 Nadeera 450 3 10234 Nabila 540 4 10234
  • Clojure MySQL 语法错误异常(“[...] 靠近 '???????????????' [...]”)

    除了建立连接之外 我在使用 clojure contrib sql 做任何事情时都遇到困难 我有一个 mysqld 在 localhost 3306 上运行 数据库名为clj db 用户 clj user localhost 和密码 clj
  • 在 PHP 中将十进制/双精度/浮点值与 PDO 绑定的最佳方法是什么?

    看来类常量只涵盖PDO PARAM BOOL PDO PARAM INT and PDO PARAM STR用于绑定 您只是将十进制 浮点 双精度值绑定为字符串还是有更好的方法来处理它们 MySQLi 允许使用 d 类型表示 double
  • 如何在Sequelize中从主模型同一级别的包含模型返回结果?

    这是我在项目中完成的代码和结果 我想获得包含模型的结果与主模型相同的结果 下面的代码是我所做的 序列化查询 User findAll include model Position attributes POSITION NAME then
  • Yii 查询时对相关模型的限制

    我遇到了极限问题 我正在使用的代码如下 model PostCategory model record model gt with array posts gt array order gt posts createTime DESC li
  • 高效插入和更新时检查唯一性

    我的员工表中有 2 列 每列值必须是唯一的 staff code staff name staff id staff code staff name 1 MGT Management 2 IT IT staff 当向表中插入或更新项目时 我
  • 累计非重复计数

    我正在查询每天获取 uid 的累计不同计数 示例 假设有 2 个 uid 100 200 出现在日期 2016 11 01 并且它们也在第二天出现 新的 uid 300 100 200 300 出现在 2016 11 02 此时我希望商店累

随机推荐

  • Range Key 组合键查询

    目前我有一个包含以下字段的集合 userId otherUserId date status 对于我的 Dynamo 集合 我使用 userId 作为hashKey并为rangeKey我想使用日期 otherUserId 通过这样做 我可以
  • Bootstrap selectpicker 在克隆的 div 中刷新后重复

    我有一个引导选择器 div div class hidden div div
  • tf.train.get_global_step() 在 TensorFlow 中做什么?

    函数有什么用tf train get global step 在 TensorFlow 中 在机器学习概念中它相当于什么 当训练过程因某种原因停止时 您可以使用它从上次中断的地方重新开始训练 当然 您随时可以在不知道情况的情况下重新开始训练
  • PHP - 检查两个数组是否相等

    我想检查两个数组是否相等 我的意思是 相同的大小 相同的索引 相同的值 我怎样才能做到这一点 Using 根据用户的建议 我希望打印以下内容enter如果数组中至少有一个元素不同 但事实上并非如此 if POST atlOriginal o
  • Delphi 通用 TInterfaceList 可能吗?

    在Delphi 2010中 我定义了一个通用的TInterfaceList 如下所示 type TInterfaceList
  • ActiveAdmin 如何添加没有模型的自定义控制器[重复]

    这个问题在这里已经有答案了 可能的重复 将页面添加到活动管理 https stackoverflow com questions 7639978 add page to active admin 我目前正在寻找一种解决方案 用于将没有模型的
  • Microsoft .NET 4.0 完整框架和客户端配置文件之间的差异

    Microsoft NET Framework 4 0 完整安装程序 32 位和 64 位 为 48 1 MB 客户端配置文件安装程序为 41 0 MB 提取的安装文件分别为 237 MB 和 194 MB 安装后分别为 537 MB 和
  • D3.js - 是否可以在力导向图和节点链接树之间制作动画?

    我正在使用D3 js库并查看力导向图演示 http mbostock github com d3 ex force html http mbostock github com d3 ex force html 我也在查看节点链接树 http
  • 如何在 sitecore 中确定给定项目是否为起始项目?

    在配置文件中 我们为元素中的每个网站设置启动项 例如 startItem Home 我们还可以在代码中选择启动项 但我想问的是如何确定任何选定的项目是否是起始项目 至少我们可以选择开始项目并与给定项目进行比较 但我认为这不是优雅的代码 我们
  • SendMessage消息号的解释?

    我已经成功地使用 Windows SendMessage 方法来帮助我在文本编辑器中执行各种操作 但每次我只是复制和粘贴其他人建议的代码 而且我并不真正知道它的含义 总是有一个神秘的消息号作为参数 我如何知道这些代码的含义 以便我能够真正理
  • 需要电子邮件地址域 jQuery 验证 [重复]

    这个问题在这里已经有答案了 我正在使用以下代码 与jQuery 验证插件 http jqueryvalidation org 验证电子邮件地址 schedule tour form validate rules Email required
  • MongoDb 近/geonear 可变距离查询

    我想执行一个查询 其中距离是集合中的动态字段 集合中的条目示例 name myName location lat 10 lng 20 maximumDistance 10 name myName2 location lat 20 lng 2
  • Polymer 1.x:纸张对话框模式出现在应用程序标题布局后面

    我想将一个子元素 子元素 放入app header layout 子元素包含一个paper dialog modal 当我打开模式时 我希望看到对话框出现在front的背景 相反 会出现对话框behind背景 如何让模式对话框出现在背景前面
  • 使用selenium在多个浏览器上同时运行python SCRIPT

    我想使用 selenium 在多个浏览器上运行我的脚本 到目前为止 我可以通过一次打开一个浏览器来执行该操作 例如 注册亚马逊 我希望能够同时向亚马逊注册两个用户 这是我现在拥有的代码 import time from selenium i
  • cin.get() 循环

    我试图从标准输入读取 第一行是我要阅读的行数 我接下来读到的行将再次打印 这是代码 include
  • Print/Debug.Log 未在 Unity 控制台上显示输出

    I am trying to print a simple statement using C on Unity Console but i don t know why it is not printing 如果打印有not work D
  • 为 UWP 构建 OpenCV

    我目前正在努力为 UWP 构建 OpenCV 我已经用谷歌搜索了很多并发现微软的 OpenCV Github 存储库 https github com Microsoft opencv tree vs2015 samples从技术上讲 这应
  • 如何在 swift 中声明一个可在 Objective C 中使用的常量

    如果我将 swift 常数声明为全局常数 like let a 123 but the a无法在以下位置找到目标c 怎么解决这个问题呢 SWIFT代码 public class MyClass NSObject public static
  • C++ HDF5 找不到 -lhdf5d

    情况 我想创建一个程序来读取一些内容 hdf5 file 我做了什么 没什么 但添加hdf5 lib到项目 Problem 我收到两个错误 当我尝试运行该程序时 cannot find lhdf5d error ld returned 1
  • SELECT 非规范化列到单独的记录中?

    我正在使用 SQL 一点 这样如果我在工作面试中被问到 我就不会完全不知道它 我的朋友最近在面试时被问到以下问题 他答不出来 我问了工作中熟悉 SQL 的人 他也不知道 你们能帮我回答这个问题 然后解释一下它是如何工作的吗 请 问题 数据库