【问题标题】:Creating Join to Display Values of One column from T1 which are not in T2 with some where comparisons创建连接以显示 T1 中不在 T2 中的一列的值,并进行一些比较
【发布时间】:2017-04-11 10:30:10
【问题描述】:

我正在尝试在 MYSQL 存储过程中创建连接,一张表是 EMployeeMaster,另一张表是 WeekRest。

在某些条件下,我的加入应该只为那些在第二个表 WeekRest 中不存在 EMPID 的 EMPID 生成来自 EmpMaster 的 EMPID 值。我无法获得预期的结果。

为表和我创建的连接添加必要的列和示例值。

  1. 为第一个表创建语句hrmempmaster

        CREATE TABLE `hrmempmaster` (
      `ID` int(11) NOT NULL AUTO_INCREMENT,
      `EMPID` varchar(45) NOT NULL,
      `Department` varchar(45) DEFAULT NULL,
      `Designation` varchar(45) DEFAULT NULL,
      `ShiftName` varchar(45) DEFAULT NULL,
      `ShiftID` varchar(45) DEFAULT NULL,
      `ReportingTo` varchar(45) DEFAULT NULL,
      `UnitCode` varchar(45) DEFAULT NULL,
      `UnitName` varchar(45) DEFAULT NULL,
      `DivisionName` varchar(45) DEFAULT NULL,
      `DivisionCode` varchar(45) DEFAULT NULL,
      `Name` varchar(50) DEFAULT NULL,
      `Gender` varchar(50) DEFAULT NULL,
      `DOB` varchar(50) DEFAULT NULL,
      `DOJ` varchar(50) DEFAULT NULL,
      `FatherName` varchar(45) DEFAULT NULL,
      PRIMARY KEY (`ID`),
      UNIQUE KEY `EMPID_UNIQUE` (`EMPID`),
      UNIQUE KEY `ID_UNIQUE` (`ID`)
    ) ENGINE=InnoDB AUTO_INCREMENT=428 DEFAULT CHARSET=utf8;
    
  2. 为第二个表创建语句WeekRest

    CREATE TABLE `hrmweekrest` (
      `ID` int(11) DEFAULT '1',
      `EmpID` varchar(45) NOT NULL,
      `EmpName` varchar(45) DEFAULT NULL,
      `FatherName` varchar(45) DEFAULT NULL,
      `Department` varchar(45) DEFAULT NULL,
      `Designation` varchar(45) DEFAULT NULL,
      `WeekRestOn` varchar(45) DEFAULT NULL,
      `Month` varchar(45) NOT NULL,
      `Year` varchar(45) NOT NULL,
      `Status` varchar(45) DEFAULT NULL,
      `MonthYear` varchar(45) DEFAULT NULL,
      PRIMARY KEY (`EmpID`,`Month`,`Year`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
  3. 我的程序没有给出预期值

    CREATE DEFINER=`root`@`localhost` PROCEDURE `HRFetchWeekRest`(IN Department VARCHAR(25), IN MonthYear varchar (15))
    begin
    
    select hrmempmaster.empid, hrmempmaster.Name,hrmempmaster.FatherName, hrmempmaster.Department,hrmempmaster.Designation, HRMWEEKREST.WeekRestOn FROM HRMEMPMASTER
    
    LEFT JOIN HRMWEEKREST ON HRMEMPMASTER.EMPID = HRMWEEKREST.EMPID
    
    where hrmempmaster.empid not in (select empid from HRMWEEKREST where HRMWEEKREST.MonthYear = MonthYear  ) and  hrmempmaster.department = Department;
    
    end
    
  4. 示例

如果 EmployeeMaster 表有 1 名员工,其 EMPID ID1、ID2、ID3....,我将所有员工的部门作为 Dept1 传递,WeekRest 表在列中包含以下值

    # ID, EmpID, EmpName, FatherName, Department, Designation, WeekRestOn, Month, Year, Status, MonthYear
    1, ID1, Name1, Fname1, Dept1, Designation1, Sunday, January, 2017, Active, January2017

那么当

i) 部门传递为“Dept1”,MonthYear 传递为“February2017” select 语句应返回所有 EMPID,因为在 Weekrest 表中没有任何值。将二月视为一年中除一月之外的任何其他月份

ii) 部门传递为“Dept1”,MonthYear 传递为“January2017” select 语句应返回除 ID1 之外的所有 EMPID,因为除 ID1 之外,没有任何 ID 在 Weekrest 表中具有值。

将尽快提供任何进一步的信息

【问题讨论】:

  • 要描述实际问题,您应该大幅减少所有代码和单词

标签: mysql select join where procedures


【解决方案1】:

试试这个

 CREATE DEFINER=`root`@`localhost` PROCEDURE `HRFetchWeekRest`(IN Department VARCHAR(25), IN MonthYear varchar (15))
    begin

    select hrmempmaster.empid, hrmempmaster.Name,hrmempmaster.FatherName, hrmempmaster.Department,hrmempmaster.Designation, HRMWEEKREST.WeekRestOn FROM HRMEMPMASTER

    LEFT JOIN HRMWEEKREST ON HRMEMPMASTER.EMPID = HRMWEEKREST.EMPID AND HRMWEEKREST.MonthYear = MonthYear

    where HRMWEEKREST.empid  IS NULL and  hrmempmaster.department = Department;

    end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-29
    相关资源
    最近更新 更多