带有OR语句的JOIN语句

时间:2018-06-07 16:45:49

标签: sql join

我正在尝试用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​

非常感谢任何帮助。我只是把时间缠绕在这个

2 个答案:

答案 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中选择任何字段。