0

別のテーブル「B」からすべての行を除外する T-SQL クエリを開発しようとしています。この別のテーブル「B」には、合計 136 行の PK を構成する 3 つの列があります。したがって、テーブル「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))
4

3 に答える 3

3

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

ご存知のように、Select all rows from one table that don't exist in another table をご覧ください。

基本的に、別のテーブルにない onr テーブルからすべての行を選択するには、少なくとも 5 つの方法があります。

  • ありませんで
  • 存在しません
  • LEFT と RIGHT JOIN
  • アウターアプライ (2005+)
  • 例外 (2005 年以降)
于 2010-08-23T16:03:07.600 に答える
2

を使用した差演算の一般的な解決策を次に示しますleft join

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

もちろん、あなたのものにはもっと複雑なjoin on句がありますが、基本的な操作は同じです。

于 2010-08-23T16:05:07.503 に答える
0

サブクエリで「NOT IN」を使用できると思いますが、マルチフィールドキーがあるといいますか?

左外部結合を使用してから、右側で null をテストすることを考えています...

マーティン。

于 2010-08-23T16:03:26.897 に答える