SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 19.11.2011 18:21:52

FiMko
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 18.09.2009
Сообщений: 198

Inner join пустой таблицы

Ребята, подскажите, пожалуйста, принцип работы.

Это работает (для непустой таблицы получаем результат):

SELECT * FROM table;

Это не работает (empty set):
SELECT * FROM table JOIN table AS table2 ON TRUE = FALSE;

То есть, при попытке сделать Join пустой таблицы поведение поменялось. Ожидаю декартово произведение, в котором каждая строка одной таблицы будет сопоставлена с каждой строкой другой таблицы. То есть получается пустой результат * непустой результат = пустой результат? Можете пояснить? Заранее спасибо!

Отредактированно FiMko (19.11.2011 18:24:25)

Неактивен

 

#2 19.11.2011 18:41:10

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Inner join пустой таблицы

Вы задали невыполнимое условие. Результат - подмножество декартова произведения, для которого выполняется заданное условие, то есть пустое множество. Напишите WHERE 1=1

Неактивен

 

#3 19.11.2011 18:53:03

FiMko
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 18.09.2009
Сообщений: 198

Re: Inner join пустой таблицы

rgbeast написал:

Вы задали невыполнимое условие. Результат - подмножество декартова произведения, для которого выполняется заданное условие, то есть пустое множество. Напишите WHERE 1=1

Спасибо! Но я уже так пробовал...

SELECT * FROM table JOIN table AS table2 ON TRUE = FALSE WHERE 1 = 1;

Результат:
Empty set (0.00 sec)
mysql> select version();
+------------+
| version()  |
+------------+
| 5.5.13-log |
+------------+

Отредактированно FiMko (19.11.2011 18:59:18)

Неактивен

 

#4 19.11.2011 19:17:23

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Inner join пустой таблицы

SELECT * FROM table JOIN table AS table2 ON 1=1;

Неактивен

 

#5 19.11.2011 19:36:32

FiMko
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 18.09.2009
Сообщений: 198

Re: Inner join пустой таблицы

rgbeast написал:

SELECT * FROM table JOIN table AS table2 ON 1=1;

Хмм..., у меня, очевидно, недопонимание работы Join. Идея была в том, чтобы использовать как-то так:


SELECT * FROM w
JOIN s AS s1 ON s1.col1id = 2
JOIN s AS s2 ON s2.col2id = 2
JOIN p ON p.id = s1.col2id OR p.id = s2.col1id
WHERE w.wid = p.wid;

mysql> describe w;
+--------+------------------+
| Field  | Type             |
+--------+------------------+
| wid    | int(10) unsigned |
| data   | varchar(100)     |
+--------+------------------+

mysql> describe p;
+-----------------+------------------+
| Field           | Type             |
+-----------------+------------------+
| id              | int(10) unsigned |
| wid             | int(10) unsigned |
+-----------------+------------------+

mysql> describe s;
+-----------+------------------+
| Field     | Type             |
+-----------+------------------+
| col1id    | int(10) unsigned |
| col2id    | int(10) unsigned |
+-----------+------------------+

Соответственно, если "JOIN s AS s2 ON s2.col2id = 2" дает пустой пустой результат, то в итоге весь запрос выдает пустой результат. Как это можно поправить?

Отредактированно FiMko (19.11.2011 20:44:24)

Неактивен

 

#6 19.11.2011 20:57:31

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Inner join пустой таблицы

Посмотрите также LEFT JOIN

Неактивен

 

#7 19.11.2011 21:39:26

FiMko
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 18.09.2009
Сообщений: 198

Re: Inner join пустой таблицы

rgbeast написал:

Посмотрите также LEFT JOIN

Спасибо!

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson