該解決方案比馬可更詳細的,而應該是更有效,因爲它避免了使用臨時表...
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 | |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
...比較d馬克的...
+----+-------------+-----------------+------+---------------+------+---------+------+------+----------------------------------------------+
| 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-15 16:33:42
Aya
如果我理解正確,您正在尋找從每個'emp否'組返回活動記錄?但是,在上面的'emp No = 820'的情況下,爲什麼兩個記錄都處於活動狀態,爲什麼要返回'sal_id = 2'而不是'sal_id = 1'?那麼沒有活躍記錄的情況下(未顯示)呢? – eggyal
每位員工總是有兩個'sal_id',或者可能有任何數量? – Aya
是的,每個員工的活動記錄但sal_id記錄2處於活動狀態應該返回,而不是sal_id 1,這也將是活動的....是的,有兩種類型「薪水」= 1和「小時」= 2所有員工將有一個工資值作爲活動,但大約一半將按小時支付,並且將具有1和2的有效記錄ID,但是在這種情況下僅應該返回ID 2 –