我正在尝试解决连接问题,其中我需要在连接中使用or语句。
我有两张桌子。表1有大约1000条记录,表2有数百万条记录。
表1有两个字段(claim1、claim2),如果这两个字段中的任何一个与表2的claim2字段匹配,那么我需要将table2.field1和table2.field2值插入到一个临时表中。
假设我有这两张表
table 1 claim1 claim2 table 2 claim field1 field2
1001 2001 1001 a1 a2
1002 2002 1002 b1 b2
1003 2003 1003 c1 c2
2001 d1 d2
2002 e1 e2我正在尝试从表2中获取claim1和claim2字段的表1中记录的值。
所以我写了这篇文章
SELECT CLAIM, FIELD1, FIELD2
FROM TABLE1 T1
JOIN TABLE2 T2 ON T2.CLAIM = T1.CLAIM1
OR T2.CLAIM = T1.CLAIM2如果我只是运行它,它会在几秒钟内运行,然后我就能拿回记录。
SELECT CLAIM, FIELD1, FIELD2
FROM TABLE1 T1
JOIN TABLE2 T2 ON T2.CLAIM = T1.CLAIM1 添加or语句后,我在大约15分钟后终止了查询。
SELECT CLAIM, FIELD1, FIELD2
FROM TABLE1 T1
JOIN TABLE2 T2 ON T2.CLAIM = T1.CLAIM1
OR T2.CLAIM = T1.CLAIM2任何帮助都将不胜感激。我只是花了好长时间才想明白这一点
发布于 2018-06-08 02:10:17
请检查此SQL:
SELECT CLAIM, FIELD1, FIELD2 FROM TABLE1 JOIN TABLE2 ON TABLE1.CLAIM1 = TABLE2.CLAIM
UNION ALL
SELECT CLAIM, FIELD1, FIELD2 FROM TABLE1 JOIN TABLE2 ON TABLE1.CLAIM2 = TABLE2.CLAIM它应该是有效的!
但是,我认为query中一定包含了您的父级TABLE1表中的更多列。因为在给定的示例中,此查询的工作方式类似于过滤器。一个筛选器,它将确保TABLE2的所有记录在临时表中都至少有一条记录在父TABLE1中。
如果您正在以完整性的方式管理您的数据,那么结果将与SELECT * FROM TABLE2相同。
发布于 2018-06-08 02:35:34
OR是一个性能杀手,特别是对于JOINs。你可以用两个LEFT JOINs来解决这个问题:
SELECT COALESCE(T2_1.CLAIM, T2_2.CLAIM) as CLAIM,
COALESCE(T2_1.FIELD1, T2_2.FIELD1) as FIELD1,
COALESCE(T2_1.FIELD2, T2_2.FIELD2) as FIELD2
FROM TABLE1 T1 LEFT JOIN
TABLE2 T2_1
ON T2_1.CLAIM = T1.CLAIM1 LEFT JOIN
TABLE2 T2_2
ON T2_2.CLAIM = T1.CLAIM2 AND T2_1.CLAIM IS NULL
WHERE T2_1.CLAIM IS NOT NULL OR T2_2.CLAIM IS NOT NULL;奇怪的是,您没有从TABLE1中选择任何字段。
https://stackoverflow.com/questions/50746414
复制相似问题