Неожиданный вывод базы данных при использовании INNER JOIN

У меня есть следующий запрос SQL

SELECT 
       r.BEZEICHNUNG AS BEZEICHNUNG, r.ID AS ID,
       ra.BEZEICHNUNG AS raumBEZEICHNUNG, ra.ID AS raumID
FROM 
       RAUM r
       INNER JOIN RAZUORDNUNG rz ON rz.RAUM_ID = r.ID
       INNER JOIN RAUMATTRIBUTE ra ON rz.RAUMATTRIBUTE_ID = ra.ID 

WHERE
       RAUMKLASSE_ID = ISNULL(@Raumklasse_ID, RAUMKLASSE_ID) 
AND    STADT_ID = ISNULL(@Stadt_ID, STADT_ID) 
AND    GEBAEUDE_ID = ISNULL(@Gebaeude_ID, GEBAEUDE_ID) 
AND    REGION_ID = ISNULL(@Region_ID, REGION_ID)
AND    RAUMATTRIBUTE_ID = ISNULL(@Raumattribute_ID, RAUMATTRIBUTE_ID)     

Но я думаю, что с этим что-то не так.

Например:

Если я поставлюthree вRAUMKLASSE_ID текстовое поле в браузере и вызвать мой метод, он возвращает только одну комнату. Но есть шесть комнат с этим удостоверением личности. Странно то, что если я уберу дваINNER JOIN и вторая строка моегоSELECT, как это:

SELECT 
       r.BEZEICHNUNG AS BEZEICHNUNG, r.ID AS ID
FROM 
       RAUM r
WHERE
       RAUMKLASSE_ID = ISNULL(@Raumklasse_ID, RAUMKLASSE_ID) 
AND    STADT_ID = ISNULL(@Stadt_ID, STADT_ID) 
AND    GEBAEUDE_ID = ISNULL(@Gebaeude_ID, GEBAEUDE_ID) 
AND    REGION_ID = ISNULL(@Region_ID, REGION_ID)
AND    RAUMATTRIBUTE_ID = ISNULL(@Raumattribute_ID, RAUMATTRIBUTE_ID)

он возвращает шесть комнат, и это правильно. Я не знаю, в чем проблема с моим запросом. Может быть, кто-то может помочь мне с этим?

заранее спасибо

 TomTom20 июн. 2012 г., 09:57
Кроме того - если вы не ожидаете, что результат будет НЕПРАВИЛЬНЫМ (то есть ошибка, которая дает результаты, которые технически неверны), это неправильный вопрос. Это более "неожиданно" результат - из-за плохого SQL.
 ypercubeᵀᴹ20 июн. 2012 г., 09:51
Потому что только одна из 6 комнат имеет связанные данные с двумя другими таблицами?
 Paks20 июн. 2012 г., 09:55
такое же поведение, как с INNER JOIN
 ypercubeᵀᴹ20 июн. 2012 г., 09:52
Что произойдет, если вы включите дваJOIN вLEFT JOIN?
 jmclem20 июн. 2012 г., 09:56
Пожалуйста, переводите ваш код на английский тоже, задавая вопросы. Не все понимают немецкий, и это затрудняет чтение вашего кода.

Ответы на вопрос(2)

у которых нет соответствующих RAZUORDNUNG или RAUMATTRIBUTE. Вам может понадобиться левое соединение вместо этого; в этом случае raumBEZEICHNUNG и raumID могут быть нулевыми в возвращенном наборе.

 Paks20 июн. 2012 г., 10:15
вместо этого я попробовал СЛЕДУЮЩЕЕ СОЕДИНЕНИЕ, но оно действует так же, как ВНУТРЕННЕЕ СОЕДИНЕНИЕ
Решение Вопроса

FROM RAUM r
INNER JOIN RAZUORDNUNG rz ON rz.RAUM_ID = r.ID
INNER JOIN RAUMATTRIBUTE ra ON rz.RAUMATTRIBUTE_ID = ra.ID  

Вам достанутся только те комнаты, которые найдены в таблицахRAUM, RAZUORDNUNG а такжеRAUMATTRIBUTE таблицы, удаляя этиINNER JOINS получит вам все комнаты отRAUM таблицу, которая удовлетворяет вашим условиям, проверьте эти страницы для более подробной информации оJOINs:

A visual explanation for JOINs. Wikipedia article about JOINs
 20 июн. 2012 г., 10:02
@TomTom, извините, исправлено.
 20 июн. 2012 г., 10:50
@Paks, пожалуйста.
 Paks20 июн. 2012 г., 10:11
ах хорошо, я понимаю проблему сейчас. Но как я могу вернуть также комнату, которой нет в таблицах RAZUORDNUNG и RAUMATTRIBUT?
 20 июн. 2012 г., 09:58
Да. Это "неожиданно" не "НЕПРАВИЛЬНО" результат.
 20 июн. 2012 г., 10:16
@Paks, в этом случае ты долженLEFT JOIN их сRAUM таблица как это:SELECT FROM RAUM r LEFT JOIN RAZUORDNUNG ...

Ваш ответ на вопрос