2012-03-03 3 views
-1

У меня есть две таблицы с данными
tab1.sql join запрос не работает

------------------------------------------------------------ 
compid | user_id | compdate |  description | 
------------------------------------------------------------ 
C0001  | U000001 | 2012-02-29 |  desc1  | 
C0002  | U000002 | 2012-02-29 |  desc1  | 
C0003  | U000001 | 2012-03-01 |  desc1  | 
C0004  | U000003 | 2012-03-01 |  desc1  | 
C0005  | U000001 | 2012-03-02 |  desc1  | 
C0006  | U000008 | 2012-03-02 |  desc1  | 
C0007  | U000212 | 2012-03-02 |  desc1  | 
C0008  | U010222 | 2012-03-02 |  desc1  | 
C0009  | U000091 | 2012-03-02 |  desc1  | 
C0010  | U010222 | 2012-03-02 |  desc1  | 
------------------------------------------------------------ 

tab2.

------------------------------------------------------------ 
compid | assigned_to| assignedon |  status  | 
------------------------------------------------------------ 
C0001  | U000101 | 2012-02-29 |  Closed  | 
C0002  | U000101 | 2012-02-29 |  Open   | 
C0003  | U000102 | 2012-03-02 |  Closed  | 
C0004  | U000102 | 2012-03-02 |  Closed  | 
C0005  | U000101 | 2012-03-02 |  Open   | 
C0006  | U000101 | 2012-03-02 |  Closed  | 
C0008  | U000101 | 2012-03-02 |  Closed  | 
------------------------------------------------------------ 

Теперь я хочу это:
Все записи, в которых Status = 'Open', а также запись с tab1, въезд не в tab2.
Запрос должен извлекать записи, которые compdate = '2012-03-02'.

То, что я попытался это:

select 
from tab1 a 
     left join dbo.tab2 b 
     on a.CompId = b.CompId 
where b.StatusFlag = 'Open' 
    and a.CompDate = CONVERT(nvarchar(30),Dateadd(day,-1,getdate()),106) 

Ожидаемые результаты:

--------------------------------------------------------------------------------------- 
compid | user_id | compdate |description |assigned_to | assignedon |status| 
--------------------------------------------------------------------------------------- 
C0005 | U000001 | 2012-03-02 | desc1  | U000101  | 2012-03-02 | open | 
C0009 | U000001 | 2012-03-02 | desc1  | Null  | NULL  | null | 
C0010 | U000001 | 2012-03-02 | desc1  | null  | null  | null | 
---------------------------------------------------------------------------------------- 
+0

Если вы хотите, чтобы записи со статусом «открытые», почему вы используете '! ='? – bernie

+1

Так в чем проблема? Вы получаете ошибку или просто не ожидаемый результат? –

+0

Похоже, вы выбираете строки, где compdate за два дня до текущей даты. Если вам нужны строки, где compdate «2012-03-02», вам придется подождать до воскресенья, чтобы запустить это. –

ответ

3
Select * 
From 
    Tab1 
Left Join 
    Tab2 
on 
    Tab1.CompID = Tab2.CompID 
Where 
    (Tab2.Status = 'open' or 
    Tab2.Status is null) and 
    Tab1.CompDate = '2012-03-02' 
0

Является ли это то, что вы пытаетесь выбрать?

select * from tab2 t2 
left join tab1 t1 on t1.compid = t2.compid 
where t2.[status] = 'Open' and 
t1.compdate in (select compdate from tab1 except 
select assignedon from tab2) 
and t1.compdate = '20120302' 
0

Я понимаю, что вы ищете объединение данных: Все записи со статусом является Open union записей из tab1 нет в tab2. Это был бы тот запрос:

select * from (
    select t1.compid, t1.user_id, t1.compdate from tab1 t1 
    left join tab2 t2 on t1.compid = t2.compid 
    where t2.compid is null 
    union 
    select compid, assigned_to, assignedon from tab2 
    where statusflag = 'Open' 
) t 
where compdate = '2012-03-02' 
+0

Объединение не требуется. Обратитесь к правильному ответу Aheho. –