MySQL:查询表并可能用另一个表中的值替换某些字段

时间:2012-01-21 06:36:52

标签: mysql

我有两张桌子。 Table1是我们的主要数据表,Table2有Table1列的子集和Table1中包含的记录的子集。您可以将Table2视为一个表,其中包含Table1记录的某些更正值。

我想使用以下规则从这些表中查询一个或多个记录:

(1)如果记录的id仅存在于Table1中,我想获取该记录的所有列(相当于select * from Table1 where Table1.id in (1, 2, 3)

(2)如果Table1和Table2中都存在记录的id,那么对于Table2中的每一列,Table2值应优先于Table1的相应值。对于Table1中的所有列而不是Table2中的所有列,我们返回Table1值。

例如:

表1

| id | Column1 | Column2 | Column3 | Column4 |
----------------------------------------------
| 1  | AA-1-1  | AA-1-2  | AA-1-3  | AA-1-4  |
| 2  | AA-2-1  | AA-2-2  | AA-2-3  | AA-2-4  |
| 3  | AA-3-1  | AA-3-2  | AA-3-3  | AA-3-4  |

表2

| id | Column2 | Column4 |
--------------------------
| 1  | ZZ-1-2  | ZZ-1-4  |
| 3  | ZZ-3-2  | ZZ-3-4  |

查询id为(1,2,3)的记录应该返回:

| id | Column1 | Column2 | Column3 | Column4 |
----------------------------------------------
| 1  | AA-1-1  | ZZ-1-2  | AA-1-3  | ZZ-1-4  |
| 2  | AA-2-1  | AA-2-2  | AA-2-3  | AA-2-4  |
| 3  | AA-3-1  | ZZ-3-2  | AA-3-3  | ZZ-3-4  |

是否有可能提出这样的查询?提前谢谢!

1 个答案:

答案 0 :(得分:1)

SELECT table1.id, Column1, IFNULL(table2.Column2, table1.Column2),
    column3, IFNULL(table2.Column4, table1.Column4)
FROM table1
LEFT JOIN table2 ON table1.id = table2.id
WHERE (table1.id IN (1,2,3))

IFNULL(a,b)转换为IF (a IS NULL) then b else a - 如果第一个参数为null,它将返回第二个参数,否则返回第一个参数。