Вопрос по c#, sql, sql-server-2008 – Неожиданный вывод базы данных при использовании INNER JOIN

1

У меня есть следующий запрос 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)

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

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

Кроме того - если вы не ожидаете, что результат будет НЕПРАВИЛЬНЫМ (то есть ошибка, которая дает результаты, которые технически неверны), это неправильный вопрос. Это более "неожиданно" результат - из-за плохого SQL. TomTom
Что произойдет, если вы включите дваJOIN вLEFT JOIN? ypercubeᵀᴹ
такое же поведение, как с INNER JOIN Paks
Потому что только одна из 6 комнат имеет связанные данные с двумя другими таблицами? ypercubeᵀᴹ
Пожалуйста, переводите ваш код на английский тоже, задавая вопросы. Не все понимают немецкий, и это затрудняет чтение вашего кода. jmclem

Ваш Ответ

2   ответа
2

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

вместо этого я попробовал СЛЕДУЮЩЕЕ СОЕДИНЕНИЕ, но оно действует так же, как ВНУТРЕННЕЕ СОЕДИНЕНИЕ Paks
3

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
@Paks, в этом случае ты долженLEFT JOIN их сRAUM таблица как это:SELECT FROM RAUM r LEFT JOIN RAZUORDNUNG ...
Да. Это "неожиданно" не "НЕПРАВИЛЬНО" результат.
@Paks, пожалуйста.
ах хорошо, я понимаю проблему сейчас. Но как я могу вернуть также комнату, которой нет в таблицах RAZUORDNUNG и RAUMATTRIBUT? Paks
@TomTom, извините, исправлено.

Похожие вопросы