2016-11-24 7 views
1

Мне нужно найти недостающие строки, однако мне нужны данные из BOTH таблиц, которые будут возвращены. Я проверил Google, но не нашел аналогичного вопроса.SQL Server: поиск строк строк в таблице 1 не в таблице2, но нужны данные из таблиц

TableA 

thetime real-time 
1  1 pm 
2  5 pm 
3  7 pm 
4  9 pm 
5  11 pm 

Table2 
thedate transaction_num thetime 
1/1/2000 111    1 
1/1/2000 111    4 
1/1/2000 111    5 
2/1/2000 111    2 
2/1/2000 111    4 
2/1/2000 222    1 
2/1/2000 222    5 

нужно выбрать дату и transaction_num из Table2, которые не имеют времени в Table1, так что результат от оператора выбора должен иметь дату и trnsaction число пропавших без вести время не в table2:

thedate transaction_num thetime 
1/1/2000 111    2 
1/1/2000 111    3 
2/1/2000 111    1 
2/1/2000 111    3 
2/1/2000 111    5 
2/1/2000 222    2 
2/1/2000 222    3 
2/1/2000 222    4 

Это код, который я имею, но он дает мне ошибку связывания нескольких частей:

select t2.thedate, t2.transaction_num, t1.thetime 
from table2 t2 
where not exists(select t1.thetime 
       from table1 t1 
       where t2.thetime = t1.thetime) 

кто-нибудь знает, как решить эту проблему, или может указывать мне ответ? Большинство вопросов при переполнении стека для отсутствующих строк связаны с возвратом данных из одной таблицы, но мне нужно это для двух таблиц.

Спасибо

+2

Если вы явно для проверки строк в t2, где 'thetime' не найденные в t1, что вы ожидаете' t1.thetime' быть в вашем выборе пункта? –

+0

Я не уверен, что понимаю. 'thetime' 2, 3 и 1 (из ваших ожидаемых результатов) отображаются в примере, который вы указали из таблицы« A ». Вы можете объяснить? –

+0

Если вы присоединяетесь к 't2.thetime = t1.thetime', то почему бы вам просто не использовать' t2.thetime' в своем заявлении select? – sgmoore

ответ

2

Кажется, что все transaction_nums на все даты должны иметь все времена, связанные с ними. Иначе это будет считаться отсутствующим.

Для этого вы можете сначала перекрестно присоединиться к отдельной дате и transaction_num из таблицы2 и времени из таблицы1. Затем выйдите из этой производной таблицы, чтобы получить недостающие строки.

select tt.thedate, tt.transaction_num,tt.thetime 
    from (
      select * from (
     (select distinct thedate,transaction_num from table2) a cross join 
     (select distinct thetime from table1) b 
     ) 
     ) tt 
     left join table2 t2 on t2.transaction_num=tt.transaction_num and t2.thetime=tt.thetime and tt.thedate=t2.thedate 
where t2.transaction_num is null and t2.thedate is null and t2.thetime is null 

Sample Demo

+0

ваш код в образце примера именно то, что я искал! Спасибо большое. Я не думал, что этот код будет сложным. я удивлен. – Sven

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

  • Нет связанных вопросов^_^