【问题标题】:SQL Query to join two tables and filter the rows from first without corresponding entry in secondSQL查询连接两个表并从第一个过滤行,而第二个没有相应的条目
【发布时间】:2015-12-18 04:19:21
【问题描述】:

我在 Mysql 数据库中有 2 个表: 一种是Employee表,用于存储员工详细信息:employee

emp_id name
1       ABC   
2       XYZ   
3       EFG   

第二个是月工资:工资

 wage_id  emp_id month year   wage   paid
 1        1      11    2015   2000   2000
 2        2      11    2015   1000   1000
 3        3      11    2015   1500   1700
 4        1      12    2015   2000   2000
 5        3      12    2015   1500   0

我必须过滤那些没有输入当月工资或工资低于或高于工资的员工。例如。

当月=11 时

Name  Wage Paid
EFG   1500 1700

当 Month=12 时

Name  Wage  Paid
XYZ   0     0
EFG   1500  0

我尝试了几件事,但无法获得所需的输出。

Select  employee.emp_id, 
        employee.name, 
        wages.emp_id, 
        wages.wage_id, 
        wages.wage, 
        wages.paid 
From    employee 
Join    wages       On  employee.emp_id = wages.emp_id 
Where   wages.month = 11 
And     wages.year = 2015 
And     wages.wage <> wages.paid

Select  wages.wage, 
        wages.paid, 
        wages.emp_id, 
        employee.emp_id 
From    wages 
Join    employee    On  wages.emp_id = employee.emp_id 
Where   wages.month = 11 
And     wages.year = 2015 
And     wages.wage <> wages.paid

请提出更改建议。

【问题讨论】:

  • 仅适用于低于或高于您已尝试正确的工资,但我认为对于未在工资表中输入的人,您应该使用 union all 条款。
  • 顺便说一句。您应该使用唯一的命名约定,使用雇员和工资,或雇员和工资作为表名

标签: mysql sql join


【解决方案1】:

这应该可行:只需将 [month] 更改为您想要的任何内容。

SELECT e.Name, IFNULL(w.wage, 0), IFNULL(w.paid, 0)
FROM Employees e
LEFT JOIN Wages w
ON e.emp_id = w.emp_id AND [month] = 12 AND [YEAR] = 2015
WHERE w.wage IS NULL OR w.wage <> w.paid

【讨论】:

  • 我是用 T-SQL 而非 MySql 编写的。 IFNULL 不是 T-SQL 中的函数。
  • 获取所有行的工资和支付为 0,当它应该给出 5-6 行时,它给出所有行。还有一件事,我必须过滤那些条目在特定月份的工资表中不存在或较少/高的行。
【解决方案2】:
  1. 对月、年和 emp_id 进行外连接以获取工资表中的缺失行: select e.name, ifnull(w.wage,0) as wage, ifnull(w.paid,0) as paid from employee e left join wage w on w.year=2015 and w.month=11 and w.emp_id=e.emp_id
  2. 在工资为零或工资不等的情况下取行:where w.wage is null or w.wage&lt;&gt;w.paid

【讨论】:

    【解决方案3】:
    create table Employee( emp_id int not null Primary key,
    name varchar(50) null
    );
    
    insert into Employee values(1,'ABC')
    insert into Employee values(2,'XYZ')
    insert into Employee values(3,'EFG')
    
    Create table Wages (
    wage_id int not null primary key,
    emp_id int null,
    month int null,
    year int null,
    wage int    null,
    paid int null
    )
    
    
     insert into wages values(1,1,11,2015,2000,2000)
     insert into wages values(2,2,11,2015,1000,1000)
     insert into wages values(3,3,11,2015,1500,1700)
     insert into wages values(4,1,12,2015,2000,2000)
     insert into wages values(5,3,12,2015,1500,0   )
    
    -------------Query to get the desired output-----------
    SELECT e.Name, ISNULL(w.wage, 0), ISNULL(w.paid, 0)
    FROM Employee e
    LEFT JOIN Wages w
    ON e.emp_id = w.emp_id 
    AND [month] = 11 AND [YEAR] = 2015
    WHERE w.wage IS NULL OR w.wage <> w.paid
    

    试试这个

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-12
      • 1970-01-01
      • 1970-01-01
      • 2014-03-23
      • 2018-09-15
      • 2023-04-05
      • 2018-11-22
      • 2021-08-23
      相关资源
      最近更新 更多