SQL-запрос соединения не работает - PullRequest
0 голосов
/ 03 марта 2012

У меня есть две таблицы с данными
tab1.

------------------------------------------------------------
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 |
----------------------------------------------------------------------------------------

Ответы [ 3 ]

3 голосов
/ 03 марта 2012
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 голосов
/ 03 марта 2012

Я понимаю, что вы ищете объединение данных: все записи со статусом Открыто 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 голосов
/ 03 марта 2012

Это то, что вы пытаетесь выбрать?

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'
...