ПРИСОЕДИНЯЙТЕСЬ к выражению OR - PullRequest
0 голосов
/ 07 июня 2018

Я пытаюсь что-то выяснить с помощью проблемы JOIN, где мне нужно использовать оператор или в соединении.

У меня есть 2 таблицы.В таблице 1 содержится около 1000 записей, а в таблице 2 - миллионы.

В таблице 1 есть 2 поля (заявка1, заявка2), и если любое из этих полей совпадает с полем таблицы 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 как для полей утверждений 1, так и для полей утверждений 2.

Итак, я написал это

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 голосов
/ 07 июня 2018

OR - убийца производительности, особенно для JOIN с.Вы можете решить эту проблему с помощью двух LEFT JOIN s:

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.

0 голосов
/ 07 июня 2018

Пожалуйста, проверьте этот 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 , включенной взапрос.Потому что в данном примере этот запрос будет работать как фильтр.Фильтр, который гарантирует, что все записи TABLE2 , которые добавляются в TEMP TABLE , имеют хотя бы одну запись в родительском TABLE1 .

И если вы управляете своими данными честно, то результат будет примерно таким же, как и для SELECT * FROM TABLE2.

Пожалуйста, сообщите другим, если это помогло!:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...