0

我有大约 500 行的数据与下面的 4 行类似,从这个例子中我只希望使用以下逻辑返回两行:

如果emp No817 sal_id= 2 is_active0 则返回 817 sal_id1 或 IF emp No820 sal_id= 2 is_active1 然后返回 820sal_2

因此sal_id,默认情况下 1 始终处于活动状态,如果为 1,sal_id则应返回 2 而不是1,希望这是有道理的!sal_idis_active

+--------+--------+-----------+-------- ----+-----------+
| 没有 | sal_id | 价值 | 生效日期 | is_active |
+--------+--------+-----------+-------- ----+-----------+
| 817 | 1 | DED914E3B | 2013 年 1 月 4 日 | 1 |
| 817 | 2 | 0 | 0 | 0 |
| 820 | 1 | 8238942BE | 2013 年 2 月 4 日 | 1 |
| 820 | 2 | EA42574E4 | 2013 年 2 月 4 日 | 1 |
+--------+--------+-----------+-------- ----+-----------+

给我一个结果:

+--------+--------+------------+----------------+-- ---------+
| 没有 | sal_id | 价值 | 生效日期 | is_active |
+--------+--------+------------+----------------+-- ---------+
| 817 | 1 | DED914E3B | 2013 年 1 月 4 日 | 1 |
| 820 | 2 | EA42574E4 | 2013 年 2 月 4 日 | 1 |
+--------+--------+------------+----------------+-- ---------+

不确定这甚至可以完成,请建议并感谢。

4

2 回答 2

0

假设数据存储在employee_salary这是一个肮脏的黑客;

select es.emp_no, es.sal_id, value, effective_date, is_active from employee_salary es
join ( 
     select emp_no, max(sal_id) as sal_id from employee_salary
         where is_active<>0
         group by emp_no
) selector
where es.emp_no=selector.emp_no and es.sal_id=selector.sal_id

限制:

  • 在不重写 SQL 的情况下将默认值从 2 更改为 1 并不容易。
  • 如果数据不在表中而是来自 SELECT 的结果,而不是临时表,我不清楚这种方法将如何应用。
  • 可能无法处理两种情况,is_active=0并且根据您的需要,当前没有为该 emp_no 返回结果,这是您想要的吗? sal_id=1sal_id=2
  • 正如 Aya 所指出的,这会生成一个临时表,然后在不使用索引的情况下对其进行排序,预计这会很慢。
于 2013-05-15T16:08:34.560 回答
0

这个解决方案比 Mark 的更冗长,但应该更有效,因为它避免使用临时表......

SELECT
    es1.emp_no,
    IF(es2.is_active=1, es2.sal_id, es1.sal_id) AS sal_id,
    IF(es2.is_active=1, es2.value, es1.value) AS value,
    IF(es2.is_active=1, es2.effective_date, es1.effective_date) AS effective_date,
    IF(es2.is_active=1, es2.is_active, es1.is_active) AS is_active
FROM employee_salary es1
    LEFT JOIN employee_salary es2 ON (es2.emp_no=es1.emp_no AND es2.sal_id=2)
WHERE es1.sal_id=1;

...产生...

+--------+--------+-----------+----------------+-----------+
| emp_no | sal_id | value     | effective_date | is_active |
+--------+--------+-----------+----------------+-----------+
|    817 |      1 | DED914E3B | 01/04/2013     |         1 |
|    820 |      2 | EA42574E4 | 02/04/2013     |         1 |
+--------+--------+-----------+----------------+-----------+

...并为此产生 EXPLAIN ...

+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | es1   | ALL  | NULL          | NULL | NULL    | NULL |    4 | Using where |
|  1 | SIMPLE      | es2   | ALL  | NULL          | NULL | NULL    | NULL |    4 |             |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+

...与马克的...相比

+----+-------------+-----------------+------+---------------+------+---------+------+------+----------------------------------------------+
| id | select_type | table           | type | possible_keys | key  | key_len | ref  | rows | Extra                                        |
+----+-------------+-----------------+------+---------------+------+---------+------+------+----------------------------------------------+
|  1 | PRIMARY     | <derived2>      | ALL  | NULL          | NULL | NULL    | NULL |    2 |                                              |
|  1 | PRIMARY     | es              | ALL  | NULL          | NULL | NULL    | NULL |    4 | Using where; Using join buffer               |
|  2 | DERIVED     | employee_salary | ALL  | NULL          | NULL | NULL    | NULL |    4 | Using where; Using temporary; Using filesort |
+----+-------------+-----------------+------+---------------+------+---------+------+------+----------------------------------------------+

您可以删除IF您实际上不需要值的任何子句。

于 2013-05-15T16:33:42.420 回答