人テーブル、予定テーブル、およびリマインダーテーブルを検索するクエリを実行しようとしています。条件が満たされない場合に3つのテーブルのSQL結合問題が結果を返す
私は少なくとも1つのアポイントメントを持っている人、将来のアポイントメントを持っていない人、システムにアクティブなリマインダを持っていない人のみを返信したいと思います。
SELECT p.person_ID
from people p
WHERE exists (
select 1 from appointments e where e.person_id=p.person_id
AND e.appt_kept_ind='Y')
AND not exists (
select 1 from appointments s where s.person_id=p.person_id
AND CONVERT(DateTime, s.apptdate, 112) > CURRENT_TIMESTAMP))
AND not exists (
select 1 from reminder re where re.person_id=p.person_id
AND CONVERT(DateTime, re.return_date, 112) > CURRENT_TIMESTAMP)
編集:フィードバックを取った後、左の結合を削除しました。私は、問題の1つが誰かがアクティブリマインダーを持っているアクティブな「y」であることに気づいたが、リマインダーは過去であっても「アクティブ」である可能性があるので、それらのレコードを除外します。
編集:私はいくつかの問題を持っているスキーマ
Person
person_id UniqueIdentifier NOT NULL PK
firstname nvarchar NOT NULL
lastname nvarchar NOT NULL
....
Appointments
appointment_ID uniqueidentifier NOT NULL PK
person_ID uniqueidentifier NOT NULL
apptdate nvarchar NOT NULL
apptKept nvarchar (N or Y)
Reminder
reminder_id uniqueidentifier NOT NULL PK
person_ID uniqueidentifier NOT NULL
return_date nvarchar NOT NULL
Active nvarchar (N or Y)
のための要求は:人々の複数の結果を返す、私も私が必要とするすべてのデータは、人々のテーブルにある場合、参加する必要がありますか?最後に、かなり遅いです。
私はそれが両方のテーブルから一致するものを返すようになりますし、複製を作成しますa.keptが何を知っているが、2つのテーブルを結合左いけません同じテーブルの2つのエントリをヒットした場合のエントリそのため、1人のユーザーに対して2つの予定が存在する場合、その参加のために人物の行が重複して表示されます。それらのサブセレクトに基づいてすべてのフィルタリングを行っているようですので、おそらくジョインは必要ないと思います。左のジョインも内部のジョインよりも遅いので、パフォーマンスの問題のいくつかを説明するかもしれません – thsorens
投稿した後、もう少し作業しました: – DDulla