@dNertyco

# Как такое может быть?

Я делаю `SELECT table1 + INNER JOIN table1`
Я получаю ответ, но в нём есть дубликаты, хотя в таблице их нет, но это же INNER JOIN - пересечение, почему у меня дубликаты, хоть и выборка из одной таблицы.
Код:
spoiler

``````SELECT
*
FROM
matches AS t0
LEFT OUTER JOIN matches AS t1 ON (
t0.id <> t1.id
AND (
0
OR (
1
AND t0.P1_01 = t1.P1_01
AND t0.X_02 = t1.X_02
AND t0.X_01 = t1.X_01
AND t0.X_10 = t1.X_10
AND t0.P2_01 = t1.P2_01
)
OR (
1
AND t0.P1_01 = t1.P1_01
AND t0.X_02 = t1.X_02
AND t0.X_01 = t1.X_01
AND t0.X_10 = t1.X_10
)
OR (
1
AND t0.X_02 = t1.X_02
AND t0.X_01 = t1.X_01
AND t0.X_10 = t1.X_10
AND t0.P2_01 = t1.P2_01
)
OR (
1
AND t0.P1_10 = t1.P1_10
AND t0.X_01 = t1.X_01
AND t0.X_10 = t1.X_10
AND t0.X_20 = t1.X_20
AND t0.P2_10 = t1.P2_10
)
OR (
1
AND t0.P1_10 = t1.P1_10
AND t0.X_01 = t1.X_01
AND t0.X_10 = t1.X_10
AND t0.X_20 = t1.X_20
)
OR (
1
AND t0.X_01 = t1.X_01
AND t0.X_10 = t1.X_10
AND t0.X_20 = t1.X_20
AND t0.P2_10 = t1.P2_10
)
OR (
1
AND t0.P1_01 = t1.P1_01
AND t0.X_02 = t1.X_02
AND t0.X_10 = t1.X_10
AND t0.P2_01 = t1.P2_01
)
OR (
1
AND t0.P1_01 = t1.P1_01
AND t0.X_02 = t1.X_02
AND t0.X_01 = t1.X_01
AND t0.X_10 = t1.X_10
)
OR (
1
AND t0.X_02 = t1.X_02
AND t0.X_01 = t1.X_01
AND t0.X_10 = t1.X_10
AND t0.P2_01 = t1.P2_01
)
OR (
1
AND t0.P1_10 = t1.P1_10
AND t0.X_01 = t1.X_01
AND t0.X_20 = t1.X_20
AND t0.P2_10 = t1.P2_10
)
OR (
1
AND t0.P1_10 = t1.P1_10
AND t0.X_01 = t1.X_01
AND t0.X_20 = t1.X_20
)
OR (
1
AND t0.X_01 = t1.X_01
AND t0.X_20 = t1.X_20
AND t0.P2_10 = t1.P2_10
)
OR (
1
AND t0.X_02 = t1.X_02
AND t0.X_01 = t1.X_01
AND t0.X_10 = t1.X_10
)
OR (
1
AND t0.P1_01 = t1.P1_01
AND t0.X_01 = t1.X_01
AND t0.P2_01 = t1.P2_01
)
OR (
1
AND t0.X_01 = t1.X_01
AND t0.X_10 = t1.X_10
AND t0.X_20 = t1.X_20
)
OR (
1
AND t0.P1_10 = t1.P1_10
AND t0.X_10 = t1.X_10
AND t0.P2_10 = t1.P2_10
)
OR (
1
AND t0.X_01 = t1.X_01
AND t0.X_02 = t1.X_02
AND t0.X_03 = t1.X_03
)
OR (
1
AND t0.X_10 = t1.X_10
AND t0.X_20 = t1.X_20
AND t0.X_30 = t1.X_30
)
)
)
WHERE
DATE(t0.date) = CURDATE()
AND DATE(t1.date) = CURDATE()
ORDER BY
t0.date ASC;``````
• Вопрос задан
• 97 просмотров
Решения вопроса 1
@Rsa97
Для правильного вопроса надо знать половину ответа
Найдите того, кто вам сказал, что INNER JOIN - это пересечение, и плюньте ему в лицо.
INNER JOIN - это декартово произведение. К каждой строке из первой таблицы присоединяется каждая строка из второй таблицы и из этих пар отбираются соответствующие условию в ON.

Кстати, из 18 ваших подусловий половину можно выбросить. Например, подусловие
``````(
1
AND t0.P1_01 = t1.P1_01
AND t0.X_02 = t1.X_02
AND t0.X_01 = t1.X_01
AND t0.X_10 = t1.X_10
AND t0.P2_01 = t1.P2_01
)``````
полностью перекрывается подусловием
``````(
1
AND t0.P1_01 = t1.P1_01
AND t0.X_01 = t1.X_01
AND t0.P2_01 = t1.P2_01
)``````
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

### Войдите, чтобы написать ответ

Похожие вопросы
УГМК-Телеком Екатеринбург
от 30 000 ₽
Sportmaster Lab Москва
от 180 000 ₽
Азбука Вкуса Москва
До 230 000 ₽
07 июл. 2022, в 19:33
3500 руб./в час
07 июл. 2022, в 19:09
300000 руб./за проект
07 июл. 2022, в 19:07
30000 руб./за проект