Пропустить все строки, если один идентификатор строки присутствует в другой таблице - PullRequest
0 голосов
/ 26 июня 2018

У меня есть три таблицы с этим соотношением:

T1.journo = T2.journo
T2.recid = T3.spid

        T1
ticketno  journo
   1        A1
   2        A2

    T2
journo recid
  A1    1
  A1    2
  A1    3
  A2    4
  A2    5
  A2    6


 T3
spid
 2

Я хочу только те записи T1, где T2.recid отсутствует в T3.spid.

В приведенном ниже запросе будет просто пропущена 2-я строка T2. Но я хочу, чтобы все строки T2 с опущенным journo = A1 отсутствовали, потому что в T3 присутствует один из recid для A1.

 select T1.* from T1 join T2 on T1.journo = T2.journo
 where T2.recid not in (select spid from T3)

Желаемый вывод:

ticketno journo
   2       A2

Какие-нибудь советы?

Ответы [ 7 ]

0 голосов
/ 26 июня 2018

Вы можете попробовать следующий SQL-запрос.

select T.* from T1 , T2 a where T1.journo = a.journo and a.recid not exists (select 1 from T3, T2 where T2.recid= T3.spid and T2.recid =a.reci);
0 голосов
/ 28 июня 2018

Насколько я понимаю, простое соединение

select t1.* from #t1 t1
join #t2 t2
on t1.journo <> t2.journo
join #t3 t3
on t2.recid = t3.spid
0 голосов
/ 26 июня 2018

Использование EXCEPT:

    create table t1 (ticketno int, journo char(2))
    insert into t1 values (1, 'A1'), (2, 'A2')

    create table t2 (journo char(2), recid int)
    insert into t2 values ('A1', 1), ('A1', 2), ('A1', 3), ('A2', 4), ('A2', 5), ('A2', 6)

    create table t3 ([SPID] int)
    insert into t3 values (2)

    select t1.* from t1 
    except 
    select t1.*  
    from t1 
    inner join t2 on t2.journo = t1.journo 
    inner join t3 on t2.recid = t3.[SPID]
0 голосов
/ 26 июня 2018

Для меня это звучит как not exists:

select t1.*
from t1
where not exists (select 1
                  from t2 join
                       t3
                       on t2.recid = t3.spid
                  where t2.journo = t1.journo
                 );
0 голосов
/ 26 июня 2018

SQL, уродливая, но необходимая часть нашей жизни:

SELECT * FROM T1
INNER JOIN
(SELECT a1.journo
, SUM(spid_present) AS 'total_spids'
    FROM
        (SELECT T2.journo
        , T2.ticketno
        , CASE
            WHEN t3.spid IS NOT NULL
            THEN 1
            ELSE 0
            END AS 'spid_present'
        FROM T2
        LEFT JOIN T3
        ON T2.recid = T3.spid) a1
GROUP BY a1.journo) a2
    ON T1.journo = a2.journo
    AND a2.total_spids = 0}
0 голосов
/ 26 июня 2018

Присоединиться к T2 на T3 с оставленным левым соединением. сгруппировать переменные t1, затем выполнить проверку COUNT (t3.spid) = 0. Любые нули не должны учитываться, поэтому ноль на счетчике - это то, что вы ищете.

SELECT t1.*
FROM @t1 t1
JOIN @t2 t2 ON t2.journo = t1.journo
LEFT JOIN @t3 t3 ON t3.spid = t2.recid
GROUP BY t1.ticketno, t1.journo
HAVING COUNT(t3.spid) = 0
0 голосов
/ 26 июня 2018

Должен быть в состоянии использовать не с подзапросом.

declare @t1 table (ticketno int identity(1,1), journo varchar(2))

declare @t2 table (journo varchar(2), recid int identity(1,1))

declare @t3 table (spid int)

insert into @t1
values
('A1'),
('A2')

insert into @t2
values
('A1'),
('A1'),
('A1'),
('A2'),
('A2'),
('A2')

insert into @t3
values
(2)


select T1.* , T2.*
from @t1 T1 
inner join @t2 T2 on T1.journo = T2.journo
where T2.journo not in (select t22.journo from @t2 t22 where t22.recid in (select * from @t3))

Или не существует коррелированных

where not exists(select t22.journo from  @t2 t22 where t22.recid in (select * from @t3) and t22.journo = T2.journo)
...