@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
@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
)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы