我无法构建LEFT JOIN查询以过滤掉特定数据。
表A
+-----------------+-------------+
| name (UNIQUE) | description |
+-----------------+-------------+
| test_1 | desc_1 |
| test_2 | desc_2 |
| test_3 | desc_3 |
| test_4 | desc_4 |
+-----------------+-------------+
表B
+--------+-------+
| name | data |
+--------+-------+
| test_1 | val_1 |
| test_2 | val_1 |
| test_1 | val_2 |
| test_1 | val_3 |
+--------+-------+
使用以下查询,我得到以下结果:
SELECT tableA.name, tableA.description tableB.data
FROM tableA
LEFT JOIN tableB
ON tableB.name=tableA.name
WHERE tableB.data='val_1'
结果:
+--------+-------+-------------+
| name | data | description |
+--------+-------+-------------+
| test_1 | val_1 | desc_1 |
| test_2 | val_1 | desc_2 |
+--------+-------+-------------+
以下是我要找的结果:
+--------+-------+-------------+
| name | data | description |
+--------+-------+-------------+
| test_1 | val_1 | desc_1 |
| test_2 | val_1 | desc_2 |
| test_3 | NULL | desc_1 |
| test_4 | NULL | desc_2 |
+--------+-------+-------------+
是否可以构建一个像这样过滤的查询?
答案 0 :(得分:4)
因为在WHERE子句中对TableB放置了一个过滤器,所以从最终输出中删除TableB.data列中包含“val_1”的所有行。如果您将条件作为LEFT JOIN的一部分,则过滤来自TableB的记录,但仍然从TableA获取所有记录。
您的查询将如下所示:
SELECT tableA.name, tableA.description, tableB.data
FROM tableA
LEFT JOIN tableB
ON tableB.name=tableA.name
AND tableB.data='val_1'
这将输出:
NAME DESCRIPTION DATA
test_1 desc_1 val_1
test_2 desc_2 val_1
test_3 desc_3 (null)
test_4 desc_4 (null)
您描述的输出,组合:
test_3 desc_1 (null)
test_4 desc_2 (null)
这个查询似乎不是一个合理的输出,因为表中没有这些数据,或者我缺少一些信息。
答案 1 :(得分:0)
SELECT tableA.name, tableA.description, b.data
FROM tableA
LEFT JOIN (
SELECT * FROM tableB
WHERE tableB.data='val_1' ) as b
ON b.name=tableA.name