Вниз
Скачать: CL | DM;

Связи посредством SQL   Найти похожие ветки 

← →
Denkop ©   (2003-08-14 12:46) [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
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


← →
Соловьев ©   (2003-08-14 12:54) [1]


> Когда убираю все джойны, работает нормально, но я лишаюсь
> сортировки, как это ни печально...

причем тут сортировка?

> 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 - у тебя же поэтому поля связь?

> .Ы. Попутный вопрос, могу ли написать так:

можно


← →
Denkop ©   (2003-08-14 12:58) [2]


> причем тут сортировка?

ORDER BY T3.NAME, T4.NAME, T2.NAME, T1.NAME


> а зачем тут t1.td_town=13 - у тебя же поэтому поля связь?

А почему я не могу поискать по полю по которому связываю?


← →
Denkop ©   (2003-08-14 13:02) [3]

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

Получаю пустой набор...


← →
Zacho ©   (2003-08-14 13:03) [4]

Запрос ничего не возвращает, потому что условие в каком-либо join"е не выполняется. Попытаюсь догадаться: может тебе нужен LEFT JOIN ?


← →
ЮЮ ©   (2003-08-14 13:04) [5]

Если хоть одно из значений ID_GROUP,ID_REG или ID_TOWN записи окажется NULL, то эта запись не будет возвращена запросом.
Используй LEFT JOIN вместо JOIN


← →
Denkop ©   (2003-08-14 13:41) [6]

All> Благодарен

Записей с нулами у меня вроде нет. А вот left join сработало.
А чем собственно отличается JOIN от LEFT JOIN, RIGHT JOIN и INNER JOIN?


← →
АлексейК   (2003-08-14 13:44) [7]

А чем собственно отличается JOIN от LEFT JOIN, RIGHT JOIN и INNER JOIN?
Условием отбора записей.


← →
Denkop ©   (2003-08-14 13:46) [8]

А можно поподробнее. В книге я ничего не разобрал, т.к. либо книга у меня кривая, либо кривоваты у меня мозги!


← →
Zacho ©   (2003-08-14 13:51) [9]


> 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 23:26) [10]

Возьму на заметку, спасибо за пояснение



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.014 c
3-10564
denick
2003-08-15 11:04
2003.09.04
Вопрос по Rave5.


3-10594
ionv
2003-08-14 12:29
2003.09.04
Помогите чайнику!


14-10896
Dmk
2003-08-17 14:41
2003.09.04
Net messanger


14-10898
kalishenko
2003-08-14 20:09
2003.09.04
Win2000 Server и доступ в Интернет


14-10868
Zip
2003-08-18 07:18
2003.09.04
globals.pas




   Наверх