我有一个简单的表(my_table):
id | 键 |
---|---|
1 | 真实 |
10 | 真实 |
11 | 真实 |
2 | 假 |
22 | 假 |
当我执行时:
SELECT my_table_1.id
my_table_1.key
my_table_2.id
my_table_2.key
FROM my_table AS my_table_1
INNER JOIN my_table AS my_table_2 ON my_table_1.id < my_table_2.id
WHERE my_table_1.key = my_table_2.key
我收到了想要的结果(没有重复的内部连接):
my_table_1.id | my_table_1.key | my_table_1.id | my_table_2.key |
---|---|---|---|
1 | 真实 | 11 | 真实 |
1 | 真实 | 10 | 真实 |
2 | 假 | 22 | 假 |
但现在我只想使用以下命令检查 ids 11 和 10 的值:
SELECT my_table_1.id
my_table_1.key
my_table_2.id
my_table_2.key
FROM my_table AS my_table_1
INNER JOIN my_table AS my_table_2 ON my_table_1.id < my_table_2.id
WHERE my_table_1.key = my_table_2.key
AND my_table_1.id IN (10, 11)
而不是完整的结果:
my_table_1.id | my_table_1.key | my_table_1.id | my_table_2.key |
---|---|---|---|
1 | 真实 | 11 | 真实 |
10 | 真实 | 1 | 真实 |
我得到了错误的部分结果,例如:
my_table_1.id | my_table_1.key | my_table_1.id | my_table_2.key |
---|---|---|---|
1 | 真实 | 11 | 真实 |
过了一段时间,我想出了如何用双
IN
解决这个问题:
SELECT my_table_1.id
my_table_1.key
my_table_2.id
my_table_2.key
FROM my_table AS my_table_1
INNER JOIN my_table AS my_table_2 ON my_table_1.id < my_table_2.id
WHERE my_table_1.key = my_table_2.key
AND (my_table_1.id IN (10, 11) OR my_table_2.id IN (10, 11))
这为我放入
IN
子句中的任何 id 提供了正确的结果。
但是我还有一个问题,我可以以任何方式改进这个查询吗?我真的不喜欢使用两次
IN
。
我建议直接向
ON
条件添加过滤器,因为您不想在 IN
中重复 WHERE
子句:
SELECT my_table_1.id,
my_table_1.key,
my_table_2.id,
my_table_2.key
FROM my_table AS my_table_1
INNER JOIN my_table AS my_table_2
ON my_table_1.id < my_table_2.id
AND my_table_1.key = my_table_2.key
AND (my_table_1.id IN (10, 11) OR my_table_2.id IN (10, 11));
希望这有帮助!