我正在尝试用JOIN问题解决问题,我需要在连接中使用or语句。
我有2张桌子。表1有大约1000条记录,表2有数百万条记录。
表1有2个字段(claim1,claim2),如果这些字段中的任何一个与表2.claim字段匹配,那么我需要将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中获取表1中有关claim1和claim2字段的记录的值。
所以我写了这个
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
非常感谢任何帮助。我只是把时间缠绕在这个
上答案 0 :(得分:0)
请检查此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
它应该有用!
但是,我认为查询中必须包含更多父 TABLE1 表的列。因为在给定的示例中,此查询将像过滤器一样工作。一个过滤器,用于确保 TEMP TABLE 中附加的 TABLE2 的所有记录在父 TABLE1 中至少有一条记录。
如果您使用完整性管理数据,那么结果将与SELECT * FROM TABLE2
的结果相同。
如果有帮助,请让别人知道! :)
答案 1 :(得分:0)
OR
是性能杀手,特别是JOIN
。您可以使用两个LEFT JOIN
来解决此问题:
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
中选择任何字段。