1

21 レコードのテーブルがMain1あり、一時テーブル @recordsToDelには 20 レコードがあります。20 行は両方のテーブルで同一ですが、次の選択クエリは欠落しているレコードを返さず、削除もそれを削除しません。両方のテーブルには同様の列があります。

何か提案はありますか?

SELECT * FROM dbo.Main1
WHERE NOT EXISTS
(
    SELECT * FROM @recordsToDel
);

DELETE FROM dbo.Main1
WHERE NOT EXISTS
(
    SELECT * FROM @recordsToDel
);

どうもありがとう

4

3 に答える 3

6

これを試して

 SELECT * FROM dbo.Main1
 EXCEPT
 SELECT * FROM @recordsToDel
于 2012-09-19T15:39:04.233 に答える
1

LEFT JOINは、@ recordsToDelテーブルのr.Id列に一致するかどうかに関係なく、結果のdbo.Main1テーブルのすべての行を含みます。

SELECT *
FROM dbo.Main1 m LEFT JOIN @recordsToDel r ON m.Id = r.Id
WHERE r.Id IS NULL

DELETE m
FROM dbo.Main1 m LEFT JOIN @recordsToDel r ON m.Id = r.Id
WHERE r.Id IS NULL
于 2012-11-11T08:51:54.510 に答える
1

サブクエリには where ステートメントが必要です。SELECT * FROM @recordsToDelは常に行を返すため、常に存在します。

SELECT * 
FROM dbo.Main1 as m
WHERE NOT EXISTS
(
    SELECT * 
    FROM @recordsToDel as r
    where r.m_id = m.id
);

別のコメントで、別の列で比較したいのを見ました。サブテーブルに存在しない Main1 からすべてのレコードを選択したい場合、名前と姓が同じで、サブテーブルで where ステートメントを作成できますクエリされるwhere r.firstname = m.firstname and r.lastname = m.lastname。ただし、結果を達成するために任意の列を使用できます。

于 2012-09-19T15:39:00.683 に答える