Синтаксис для SQL нет в списке? - PullRequest
0 голосов
/ 23 августа 2010

Я пытаюсь разработать запрос T-SQL, чтобы исключить все строки из другой таблицы "B". Эта другая таблица "B" имеет 3 столбца, включающих в себя PK, всего 136 строк. Поэтому я хочу выбрать все столбцы из таблицы «A», за исключением столбцов из таблицы «B». Как мне это сделать? Я не думаю, что этот запрос правильный, потому что я все еще получаю ошибку записи:

CREATE TABLE #B (STUDENTID VARCHAR(50), MEASUREDATE SMALLDATETIME, MEASUREID VARCHAR(50))
INSERT #B 
SELECT studentid, measuredate, measureid
  from [J5C_Measures_Sys] 
GROUP BY studentid, measuredate, measureid
  HAVING COUNT(*) > 1

insert into J5C_MasterMeasures (studentid, measuredate, measureid, rit)
select A.studentid, A.measuredate, B.measurename+' ' +B.LabelName, A.score_14
from [J5C_Measures_Sys] A
join [J5C_ListBoxMeasures_Sys] B on A.MeasureID = B.MeasureID 
  join sysobjects so on so.name = 'J5C_Measures_Sys' AND so.type = 'u'
join syscolumns sc on so.id = sc.id and sc.name = 'score_14' 
join [J5C_MeasureNamesV2_Sys] v on v.Score_field_id = sc.name
 where a.score_14 is not null AND B.MEASURENAME IS NOT NULL
 and (A.studentid NOT IN (SELECT studentid from #B) 
and a.measuredate NOT IN (SELECT measuredate from #B)
and a.measureid NOT IN (SELECT measureid from #B))

Ответы [ 3 ]

3 голосов
/ 23 августа 2010

использование NOT EXISTS ... NOT IN не отфильтровывает NULLS

insert into J5C_MasterMeasures (studentid, measuredate, measureid, rit)
select A.studentid, A.measuredate, B.measurename+' ' +B.LabelName, A.score_14
from [J5C_Measures_Sys] A
join [J5C_ListBoxMeasures_Sys] B on A.MeasureID = B.MeasureID 
  join sysobjects so on so.name = 'J5C_Measures_Sys' AND so.type = 'u'
join syscolumns sc on so.id = sc.id and sc.name = 'score_14' 
join [J5C_MeasureNamesV2_Sys] v on v.Score_field_id = sc.name
 where a.score_14 is not null AND B.MEASURENAME IS NOT NULL
 AND NOT EXISTS (select 1 from  #B where #b.studentid = A.studentid
 and a.measuredate = #B.measuredate
 and a.measureid = #B.measureid)
  and not exists (select 1 from J5C_MasterMeasures z 
                  where z.studentid = A.studentid)

Чтобы вы знали, посмотрите на Выберите все строки из одной таблицы, которых нет в другой таблице

Как правило, есть как минимум 5 способов выбрать все строки из таблицы, которые не находятся в другой таблице

  • НЕ В
  • НЕ СУЩЕСТВУЕТ
  • Влево и вправо присоединиться
  • ВНЕШНИЙ ПРИМЕНЕНИЕ (2005+)
  • ИСКЛЮЧИТЬ (2005 +)
2 голосов
/ 23 августа 2010

Вот общее решение для разностной операции с использованием left join:

select * from FirstTable
left join SecondTable on FirstTable.ID = SecondTable.ID
where SecondTable.ID is null

Конечно, у вас будет более сложное предложение join on, но основная операция такая же.

0 голосов
/ 23 августа 2010

Я думаю, что вы можете использовать "NOT IN" с подзапросом, но вы говорите, что у вас есть многопольный ключ?

Я бы подумал об использовании левого внешнего соединения, а затем о проверке на нулевое значение справа ...

Martin.

...