2016-05-30 3 views
-2

У меня есть две таблицы:SQL: объединение двух SQL запросов

T_CHAMBRE_CHB (CHB_NUM); 

T_PLANNING_PLN (PLN_JOUR ,CHB_NUM, PLN_LIBRE); 

у меня есть эти значения в нем:

T_CHAMBRE_CHB:

1 
2 
3 
4 

T_PLANNIG_CHB:

1 2000-01-12 1 False 
2 2000-01-12 2 False 
3 2000-01-13 1 False 
4 2000-01-13 2 False 
5 2000-01-13 4 True 

Я хотел бы получить оккупацию комнат 13 Janvier 2000 для получения информации, если помещение не в планировании (здесь 3) Что это значит, что это бесплатно, так что результат должен быть:

CHB_NUM  PLN_LIBRE 
----------- --------- 
1   False 
2   False 
3   True 
4   True 

У меня есть этот запрос:

SELECT DISTINCT TCC.CHB_NUM, TPP.PLN_LIBRE 
FROM T_CHAMBRE_CHB AS TCC, 
    T_PLANNING_PLN AS TPP 
WHERE TCC.CHB_NUM=TPP.CHB_NUM AND TPP.PLN_JOUR = '2000-01-13' 
UNION 
SELECT DISTINCT TCC.CHB_NUM, TPP.PLN_LIBRE 
FROM T_CHAMBRE_CHB AS TCC, 
    T_PLANNING_PLN AS TPP 
WHERE TCC.CHB_NUM NOT IN (SELECT DISTINCT (TPP2.CHB_NUM) FROM T_PLANNING_PLN AS TPP2); 

Я получаю этот результат:

1 1 False 
2 2 False 
3 3 False 
4 3 True 
5 4 True 

Я не знаю, почему я получаю третью строчку (3 ----> False)

Я думаю, шо я uld использует OUTER UNION, но SQL Server не любит синтаксис.

+2

Нет необходимости 'ВЫБРАТЬ DISTINCT', когда 'UNION', так как UNION будет удалять повторяющиеся строки. Нет необходимости в 'SELECT DISTINCT', когда' [NOT] IN' (sub-query.) – jarlh

ответ

1

Ниже запроса может дать требуемый результат: -

declare @date as date='2000-01-13' 

select distinct TCC.CHB_NUM,COALESCE(TPP.PLN_JOUR,@date) PLN_JOUR,COALESCE(TPP.PLN_LIBRE,'True') PLN_LIBRE  
from T_CHAMBRE_CHB TCC 
LEFT OUTER JOIN 
T_PLANNING_PLN TPP ON TCC.CHB_NUM=TPP.CHB_NUM 
WHERE [email protected] OR TPP.PLN_JOUR IS NULL 

Выход: -

CHB_NUM PLN_JOUR PLN_LIBRE 
    1  2000-01-13 False 
    2  2000-01-13 False 
    3  2000-01-13 True 
    4  2000-01-13 True 
+0

Итак, нет способа сделать это без tsql, просто pur sql? – unfoudev

+1

'выберите TCC.CHB_NUM, COALESCE (TPP.PLN_JOUR, '2000-01-13') PLN_JOUR, COALESCE (TPP.PLN_LIBRE, 'True') PLN_LIBRE от T_CHAMBRE_CHB TCC LEFT OUTER JOIN T_PLANNING_PLN ТЭС ON TCC.CHB_NUM = TPP.CHB_NUM WHERE TPP.PLN_JOUR = '2000-01-13' ИЛИ ​​TPP.PLN_JOUR NULL; '?! – Michael

1

Вы должны использовать левое соединение, если я понимаю ваш вопрос.

Пожалуйста, используйте ниже запрос может быть, это поможет вам

SELECT T_CHAMBRE_CHB.CHB_NUM, ISNULL(T_PLANNIG_CHB.PLN_LIBRE, FALSE) 
FROM T_CHAMBRE_CHB 
LEFT JOIN T_PLANNIG_CHB ON (T_CHAMBRE_CHB.CHB_NUM = T_PLANNIG_CHB.CHB_NUM) 
WHERE T_PLANNIG_CHB.PLN_JOUR = '2000-01-13' 
+0

спасибо, но я не получаю 3 -> False – unfoudev

+0

. Вы получаете 3 как Null, вы должны заменить null как false. –

+0

Я обновил свой anser, теперь использую .. –

Смежные вопросы