我有两张桌子。 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 |
是否有可能提出这样的查询?提前谢谢!
答案 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,它将返回第二个参数,否则返回第一个参数。