连接表时只保留不匹配的记录
Keep only unmatched records when joining tables
我有 2 个访问 table 包含部分相似的数据,一个比另一个更丰富。
这里的想法是通过字段 id 和 num 连接两个 tables 并从 table T2 不在 table T1
中的数字
T1:
id
num
1
34
3
51
7
23
T2:
id
num
status
1
34
done
1
79
done
1
39
done
3
51
done
7
23
done
预期结果:
id
num
status
1
79
done
1
39
done
在访问中我在互联网上看到没有像 MySQL 下那样的 MINUS 运算符,所以我尝试使用 EXCEPT 但查询需要很长时间(10 分钟后停止)
所以我尝试了这个:
SELECT T2.*
FROM T2 LEFT JOIN T1 ON (T1.id =T2.id)
WHERE T1.num IS NULL AND ( (T2.status LIKE 'done') );
现在的问题是,我没有所有在 T2 而在 T1 中的记录
您可以使用 RIGHT JOIN。我建议在这种情况下不要使用“LIKE”,因为这很慢。您可以只使用 = 运算符。所以您的查询将是:
SELECT t2.id, t2.num, t2.status
FROM t1
RIGHT JOIN t2
ON t1.id = t2.id
AND t1.num = t2.num
WHERE t1.num IS NULL
AND t2.status = 'done';
如果您要连接的所有列名在两个表中都相同,您可以更简单地连接:
SELECT t2.id, t2.num, t2.status
FROM t1
RIGHT JOIN t2
USING (id,num)
WHERE t1.num IS NULL
AND t2.status = 'done';
我不喜欢这个,但它更短。最后,具体查询还是要看你个人的“品味”了。
您缺少连接条件:
SELECT T2.*
FROM T2
LEFT JOIN T1
ON T1.id = T2.id
AND T1.num = T2.num
WHERE T1.num IS NULL
AND T2.status LIKE 'done';
检查一下here。
有很多变体。
SELECT t2.*
FROM t2
LEFT JOIN t1 USING (id, num)
WHERE t1.id IS NULL
AND t2.status = 'done'
SELECT *
FROM t2
WHERE NOT EXISTS ( SELECT NULL
FROM t1
WHERE (t1.id, t1.num) = (t2.id, t2.num) )
AND status = 'done'
还有更多变体...
这些(或其他一些)变体中哪些是最有效的?这取决于表格定义和数据统计。
我有 2 个访问 table 包含部分相似的数据,一个比另一个更丰富。 这里的想法是通过字段 id 和 num 连接两个 tables 并从 table T2 不在 table T1
中的数字T1:
id | num |
---|---|
1 | 34 |
3 | 51 |
7 | 23 |
T2:
id | num | status |
---|---|---|
1 | 34 | done |
1 | 79 | done |
1 | 39 | done |
3 | 51 | done |
7 | 23 | done |
预期结果:
id | num | status |
---|---|---|
1 | 79 | done |
1 | 39 | done |
在访问中我在互联网上看到没有像 MySQL 下那样的 MINUS 运算符,所以我尝试使用 EXCEPT 但查询需要很长时间(10 分钟后停止)
所以我尝试了这个:
SELECT T2.*
FROM T2 LEFT JOIN T1 ON (T1.id =T2.id)
WHERE T1.num IS NULL AND ( (T2.status LIKE 'done') );
现在的问题是,我没有所有在 T2 而在 T1 中的记录
您可以使用 RIGHT JOIN。我建议在这种情况下不要使用“LIKE”,因为这很慢。您可以只使用 = 运算符。所以您的查询将是:
SELECT t2.id, t2.num, t2.status
FROM t1
RIGHT JOIN t2
ON t1.id = t2.id
AND t1.num = t2.num
WHERE t1.num IS NULL
AND t2.status = 'done';
如果您要连接的所有列名在两个表中都相同,您可以更简单地连接:
SELECT t2.id, t2.num, t2.status
FROM t1
RIGHT JOIN t2
USING (id,num)
WHERE t1.num IS NULL
AND t2.status = 'done';
我不喜欢这个,但它更短。最后,具体查询还是要看你个人的“品味”了。
您缺少连接条件:
SELECT T2.*
FROM T2
LEFT JOIN T1
ON T1.id = T2.id
AND T1.num = T2.num
WHERE T1.num IS NULL
AND T2.status LIKE 'done';
检查一下here。
有很多变体。
SELECT t2.*
FROM t2
LEFT JOIN t1 USING (id, num)
WHERE t1.id IS NULL
AND t2.status = 'done'
SELECT *
FROM t2
WHERE NOT EXISTS ( SELECT NULL
FROM t1
WHERE (t1.id, t1.num) = (t2.id, t2.num) )
AND status = 'done'
还有更多变体...
这些(或其他一些)变体中哪些是最有效的?这取决于表格定义和数据统计。