【问题标题】:SQL Query; Search List from ListSQL查询;从列表中搜索列表
【发布时间】:2018-12-19 10:42:54
【问题描述】:

我是 SQL 新手,包括执行查询。每天,我们的组织都会以列出的格式发送一份被解雇的员工名单。我要做的是两件事,在column 中搜索员工ID,如果找到员工,将某个单元格/字段更新为disable

例如,如果我们得到一个员工 ID 为 123456234567 的列表,我想在 EMPID 字段中找到这些员工 ID,然后将其 ACTIVE 字段从“1”更新为“ 0'。

最好的方法是什么?

编辑,对于所有缺失的信息,我很抱歉,因为我对论坛和编码世界是全新的,我将重新解释我想要完成的事情。也许是一个功能?我更改了下面的数据,使其与我正在使用的数据与示例更加一致。

我们每天都会收到一个文本文件,其中包含已终止的员工 ID 列表,我们需要在应用程序中将其停用。我知道这仍然是手动的,但我认为这是一些自动化的良好开端。

  1. dbo.EnterpriseUser 表上,我们需要代码通过查找IVRID(这是员工的ID)来找到用户,然后将IsActive 字段从1 更新为0,并且然后使用相同的格式将LastModDate 更新为当前日期和时间。下面是我正在使用的示例表,如果格式不正确,请见谅。

    CREATE TABLE IF NOT EXISTS EnterpriseUser (
    `EnterpriseUserID` INT,
    `FirstName` VARCHAR(6) CHARACTER SET utf8,
    `LastName` VARCHAR(7) CHARACTER SET utf8,
    `IVRID` INT,
    `IsActive` INT,
    `LastModDate` DATETIME
    

    ); 插入企业用户值 (6,'罗伯特','安德鲁斯',2,1,'2018-07-11 13:01:54.670000');

  2. 第二个表dbo.Staff 也必须为应用程序正确更新。我唯一的问题是要找到要更新的记录,我必须使用来自dbo.EnterpriseUserEnterpriseUserID 字段现在位于dbo.Staff 表的StaffID 字段中。

在该行上,LastModDate 必须更改为当前日期,IsActive 必须从 1 更改为 0

CREATE TABLE IF NOT EXISTS Staff (
    `StaffID` INT,
    `FirstName` VARCHAR(6) CHARACTER SET utf8,
    `LastName` VARCHAR(7) CHARACTER SET utf8,
    `LastModDate` DATETIME,
    `IsActive` INT
);
INSERT INTO Staff VALUES
    (6,'Robert','Andrews','2018-07-11 13:01:54.670000',1);

【问题讨论】:

  • 欢迎来到 Stack Overflow!。您的问题很难回答,因为它没有包含有关您的环境的足够详细信息,因此我们无法为您提供帮助。请花点时间阅读这两个链接,如果您仍在寻求帮助,请考虑编辑您的问题。 stackoverflow.com/help/how-to-askspaghettidba.com/2015/04/24/…

标签: mysql sql qsqlquery qsqltablemodel


【解决方案1】:

OP 要求提供the best possible way to do this,但我从未遇到过最佳解决方案涉及手动键入数据的过程。

将您的列表导入一个暂存表。使用该表查找和更新受影响的记录。将列表存档,并在每条记录上标明处理时间。

这使用 SQL Server 语法,但没有什么特别之处。易于翻译成不同的方言。

CREATE TABLE dbo.DailyTerminations (
  EnterpriseUserID INT
  );

BEGIN TRANSACTION --By using a transaction, both tables will update or neither will.  
                  --For MySQL, it's START TRANSACTION

  UPDATE eu
    SET IsActive = 0
  FROM 
    dbo.EnterpriseUser as eu
  JOIN
    dbo.DailyTerminations as dt
      ON dt.EnterpriseUserID = eu.EnterpriseUserID
  WHERE 
    eu.IsActive <> 0;

  UPDATE st
    SET IsActive = 0
  FROM 
    dbo.Staff as st
  JOIN 
    dbo.EnterpriseUser as eu
      ON
        eu.EnterpriseUserID = st.StaffID
  JOIN
    dbo.DailyTerminations as dt
      ON dt.EnterpriseUserID = eu.EnterpriseUserID
  WHERE 
    IsActive <> 0;

COMMIT TRANSACTION --For MySQL, it's just COMMIT

INSERT INTO dbo.TerminationArchive
(
 EnterpriseUserID,
 ProcessedDate
)
SELECT
  EnterpriseUserID,
  GETDATE()
FROM
  dbo.DailyTerminations;

TRUNCATE TABLE 
  dbo.DailyTerminations;

【讨论】:

  • 在这个最佳解决方案中,OP 系统中的 DailyTerminations 表在哪里?如果您正在尝试找到如何在没有任何“手”的情况下首先输入这些 ID 的最佳方式,您认为呢?或者您为什么不简单地加载到临时表中并创建不必要的 DailyTerminations 表只是为了经常截断它?人们总是问“最好”,这实际上取决于可用的资源、环境等。
  • @CetinBasoz,你说得对。我们对这个问题的了解还不够,无法给出最佳解决方案。我希望 OP 能给我们更多的合作机会。
  • 嘿埃里克!!你能看看我在帖子中创建的编辑吗?我试图提供更好的细节和信息..
  • @Josh,我根据您提供的额外信息调整了我的答案。它现在应该处理两个表。
【解决方案2】:

如果您要手动检查它们,可以使用更新语句。

如果您要在表中插入员工,您可以创建一个触发器来在每次插入时检查这些员工。

【讨论】:

    【解决方案3】:

    您可以使用如下更新语句来做到这一点:

    update Employees
    set Active = 0
    where EmpId in (123456, 234567)
    

    【讨论】:

    • 如果 OP 有一张纸,上面有两个 EmpID,那会很好,但我相信他正在寻求加入标准的帮助。
    • @EricBrandt,加入什么?
    • 正是我向他询问更多细节的原因。
    • @EricBrandt,对于不是“DBA”并且只想做这样的事情的人来说,用 ID 手动编写这段代码就足够简单了。如果他不是程序员,他不需要学习如何有效地从文本文件中读取 ID 并更新状态。如果他是,那么知道他使用的语言就可以了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-24
    • 1970-01-01
    • 1970-01-01
    • 2018-07-06
    • 1970-01-01
    • 2012-10-10
    相关资源
    最近更新 更多