![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Связи посредством SQL [D7, IB6.x, FireBird]
Denkop © (2003-08-14 12:46:00)
Есть такой запрос:
SELECT * FROM MAINTABLE T1
JOIN ORG_GROUP T2 ON T1.ID_GROUP=T2.ID
JOIN REG_GROUP T3 ON T1.ID_REG=T3.ID
JOIN TOWN_GROUP T4 ON T1.ID_TOWN=T4.ID
WHERE T1.ID_TOWN=13
ORDER BY T3.NAME, T4.NAME, T2.NAME, T1.NAME
Ничего не выбирает (т.е. в результат=0 записей) и даже так не хочет:
SELECT * FROM MAINTABLE T1
JOIN ORG_GROUP T2 ON T1.ID_GROUP=T2.ID
JOIN REG_GROUP T3 ON T1.ID_REG=T3.ID
JOIN TOWN_GROUP T4 ON T1.ID_TOWN=T4.ID
ORDER BY T3.NAME, T4.NAME, T2.NAME, T1.NAME
Когда убираю все джойны, работает нормально, но я лишаюсь сортировки, как это ни печально... Т.е. запрос выглядит примено так:
SELECT * FROM MAINTABLE T1
WHERE T1.ID_TOWN=13
Подскажите, что я неправильно делаю, иначе умру с горя
З.Ы. Попутный вопрос, могу ли написать так:
SELECT * FROM MAINTABLE T1
JOIN ORG_GROUP T2 ON T1.ID_GROUP=T2.ID
JOIN REG_GROUP T3 ON T1.ID_REG=T3.ID
JOIN TOWN_GROUP T4 ON T1.ID_TOWN=T4.ID
WHERE T4.NAME="Rostov"
ORDER BY T3.NAME, T4.NAME, T2.NAME, T1.NAME
DenKop (2003-08-14 23:26:00) [1]
Возьму на заметку, спасибо за пояснение
Zacho (2003-08-14 13:51:00) [2]
> Denkop © (14.08.03 13:41) [6]
JOIN (он же INNER JOIN) - если условие соединения не выполняется, то запись не возвращается запросом. Т.е. если есть запрос
SELECT T1.F1,T2.F2
FROM TABLE_1 T1
JOIN TABLE_2 T2 ON T1.ID=T2.ID
и в таблице TABLE_2 не нашлось записи с ID, равном ID какой-либо записи из таблицы T1, то эту запись запрос не вернет.
В случае LEFT JOIN (он же LEFT OUTER JOIN ) запрос вернет запись, но в поле T2.F2 будет NULL
LEFT от RIGHT отличается тем, как связываются таблицы - левая с правой или правая с левой.
P.S. Очень рекомендую почитать какую-либо книжку с основами SQL
Denkop (2003-08-14 13:46:00) [3]
А можно поподробнее. В книге я ничего не разобрал, т.к. либо книга у меня кривая, либо кривоваты у меня мозги!
АлексейК (2003-08-14 13:44:00) [4]
А чем собственно отличается JOIN от LEFT JOIN, RIGHT JOIN и INNER JOIN?
Условием отбора записей.
Denkop (2003-08-14 13:41:00) [5]
All> Благодарен
Записей с нулами у меня вроде нет. А вот left join сработало.
А чем собственно отличается JOIN от LEFT JOIN, RIGHT JOIN и INNER JOIN?
ЮЮ (2003-08-14 13:04:00) [6]
Если хоть одно из значений ID_GROUP,ID_REG или ID_TOWN записи окажется NULL, то эта запись не будет возвращена запросом.
Используй LEFT JOIN вместо JOIN
Zacho (2003-08-14 13:03:00) [7]
Запрос ничего не возвращает, потому что условие в каком-либо join"е не выполняется. Попытаюсь догадаться: может тебе нужен LEFT JOIN ?
Denkop (2003-08-14 13:02:00) [8]
SELECT * FROM MAINTABLE T1
JOIN ORG_GROUP T2 ON T1.ID_GROUP=T2.ID
JOIN REG_GROUP T3 ON T1.ID_REG=T3.ID
JOIN TOWN_GROUP T4 ON T1.ID_TOWN=T4.ID
WHERE T4.NAME="Rostov"
ORDER BY T3.NAME, T4.NAME, T2.NAME, T1.NAME
Получаю пустой набор...
Denkop (2003-08-14 12:58:00) [9]
> причем тут сортировка?
ORDER BY T3.NAME, T4.NAME, T2.NAME, T1.NAME
> а зачем тут t1.td_town=13 - у тебя же поэтому поля связь?
А почему я не могу поискать по полю по которому связываю?
Соловьев (2003-08-14 12:54:00) [10]
> Когда убираю все джойны, работает нормально, но я лишаюсь
> сортировки, как это ни печально...
причем тут сортировка?
> SELECT * FROM MAINTABLE T1
> JOIN ORG_GROUP T2 ON T1.ID_GROUP=T2.ID
> JOIN REG_GROUP T3 ON T1.ID_REG=T3.ID
> JOIN TOWN_GROUP T4 ON T1.ID_TOWN=T4.ID
> WHERE T1.ID_TOWN=13
> ORDER BY T3.NAME, T4.NAME, T2.NAME, T1.NAME
а зачем тут t1.td_town=13 - у тебя же поэтому поля связь?
> .Ы. Попутный вопрос, могу ли написать так:
можно