2017-05-31 30 views
-1

all。SQLサーバー:キーワード一致に基づく結果の削除

アカウントに複数の行がある金融取引のデータベースがあります。それをTableAと呼んでください。

私はアカウントに複数の行を持つことができる毎日のrep活動の別のデータベースを持っています。これはTableBです。

TableBの特定のアクティビティタイプのない特定の取引タイプがTableAのアカウントにある場合、それは違反しており、レポートに表示する必要があります。

TableBの正しいアクティビティタイプには、タイトルフィールドに文字列 "%roll%"が含まれています。だから、私はTableAにトランザクションタイプXを持つが、TableBには "%roll%"を含むアクティビティタイトルのないすべての勘定を表示するとします。

私が抱えている問題は、TableBのアカウントに「%ロール%」というアクティビティタイプがあると、それが良いアカウントになり、アカウントに他のアクティビティタイプがあると結果セットに表示されるということです。良いアカウントが結果に表示されないようにするにはどうすればよいですか?ここで

は、現在のクエリです:

SELECT distinct 
DATEDIFF(DAY,GETDATE(),a.transaction_dt) as 'Aging' 
,b.RECORD_OPENED_DT 
,a.branch_cd 
,a.account_cd 
,a.branch_cd+a.account_cd as 'FULL_ACCT' 
,b.ADT_CUSTOMER_CD as 'ACCT_TYPE' 
,c.FIRST_NM 
,c.LAST_NM 
,c.COMPANY_NM 
,a.rr_cd 
,e.RR_NM 
,f.ADDRESS_EMAIL_TXT 
,i.activityEndTime 
,i.title 
,a.batch_cd 
,a.entry_cd 
,a.processing_dt 
,a.transaction_dt 
,a.tran_total_amt 

FROM (SELECT branch_cd, account_cd, rr_cd, batch_cd, entry_cd, processing_dt, transaction_dt, tran_total_amt 
    FROM TableA 
     WHERE BRANCH_CD > '299' 
     and BRANCH_CD < '400' 
     and batch_cd = 'wt' 
     and (entry_cd like 'cd%' 
      or entry_cd like 'ca%' 
      or entry_cd like 'ce%' 
      or entry_cd like 'cb%' 
      or entry_cd like 'rft') 
     and PROCESSING_DT > '2017-04-01 00:00:00.000' 
     and TRAN_TOTAL_AMT > '0.00') a 



left join Table0 b 
    on a.BRANCH_CD = b.BRANCH_CD 
    and a.ACCOUNT_CD = b.ACCOUNT_CD 
    and b.ADT_CUSTOMER_CD in ('120','121','122','122','123','124','125','126','129','130','131','132','133','134','135','139','140','141','142','143', 
     '150','151','160','161','170','171','172','180','181','182','183','184','185','186','187','188','189') 


left join Table1 c 
    on a.BRANCH_CD = c.BRANCH_CD 
    and a.ACCOUNT_CD = c.ACCOUNT_CD 
    and AP_SEQ_NBR = '1' 

left join Table2 d 
    on a.BRANCH_CD = b.BRANCH_CD 
    and a.ACCOUNT_CD = b.ACCOUNT_CD 
    and (CASE WHEN a.BRANCH_CD < '699' THEN '000' 
       ELSE a.BRANCH_CD 
       END)+a.RR_CD = (d.BRANCH_CD+d.RR_CD) 

left join Table3 e 
    on a.BRANCH_CD = b.BRANCH_CD 
    and a.ACCOUNT_CD = b.ACCOUNT_CD 
    and d.CRD_NBR = e.CRD_NBR 

left join Table4 f 
    on a.BRANCH_CD = b.BRANCH_CD 
    and a.ACCOUNT_CD = b.ACCOUNT_CD 
    and (CASE WHEN a.BRANCH_CD < '699' THEN '000' 
       ELSE a.BRANCH_CD 
       END)+a.RR_CD = (f.BRANCH_CD+f.RR_CD) 

left join Table5 g 
    on (a.branch_cd+a.account_cd) = g.accountnumber 


left join Table6 h 
    on (a.branch_cd+a.account_cd) = g.accountnumber 
     and g.primaryownerid = h.entityId 

right join (SELECT id, classcode, statuscode, title, activityEndTime 
      FROM TableB 
     where classCode = 'doc' 
     and statusCode = 'comp' 
     and title not like '%roll%') i 
    on (a.branch_cd+a.account_cd) = g.accountnumber 
     and g.primaryownerid = h.entityId 
     and h.actId = i.id 
+1

はあなたが私たちのテーブルのスキーマとサンプルデータを表示することができますか? –

+0

メインポストを更新しました。 –

答えて

0

あなたの質問は少し総称である - ので、私はむしろ、一般的な答えを提供します。

NOTで反転することができる "IN"述部があります。何かのように:概念ではありませんを使用して

SELECT 
    ta.* 
FROM 
    TableA AS ta 
WHERE 
    ta.accountId NOT IN (SELECT tb.accountId FROM TableB AS tb WHERE title LIKE '%roll%') 

、それはあなたのクエリにここに収まるようになります。一般的には

left join Table6 h 
    on (a.branch_cd+a.account_cd) = g.accountnumber 
     and g.primaryownerid = h.entityId 
     AND h.actId NOT IN (SELECT id FROM TableB WHERE title LIKE '%roll%') -- This Line ensures that account IDs are only allowed from table6 if they aren't related to infractions from tableB. 

、あなたがTableBのからの情報を表示する必要がない場合は、含まれていません。それはあなたのFROMにありますが、WHEREまたはJOIN内のフィルタとして使用してください。データを取り込むことで、サーバーが必要とする作業が増加します。ただし、問合せにTableBおよびTableAのデータが必要な場合は、IN述語なしでJOINしてください。スクラブされたスキーマを公開したり、いくつかのサンプルクエリを提供した場合は役に立ちます。

あなたの仕事を追加してくれてありがとう - まだ少し欠けていますが、私は助けてくれるほどの要点を持っていると思います。あなたがStack Overflowに投稿するときは、問題の例を表示してから、試行した試行をコード化して投票しないようにしてください。 FWIW - 私は質問をdownvoteしない、彼らがトローリングしている場合はちょうど答え。

この指示があなたを助けるかどうか教えてください。他のスレッドで対処できるパフォーマンスに問題がありますが、これはあなたが探している結果を得ることに近づくはずです。

+0

は現在の質問を投稿して投稿しました。 –

+1

@Bankの返答にコメントしたように、内部結合を持つサブクエリを使用して「良い」アカウントのリストを作成し、「NOT IN」を使用して不良のものを見つけました。あなたは正しい道で私を助けました! –

0

使用したい場合は参加:

SELECT * -- just the rows you need 
FROM TableA 
LEFT JOIN TableB on TableB.Id = TableA.Id 
WHERE TableA.TransactionType = "Something" and 
TableB.ActivityType not like '%roll%' 
+0

私は現在のコードをメインポストに追加しました。私は基本的にあなたが示唆したことをしましたが、問題は、TableBに "%roll%"に加えてActivityTypeがある場合、私が望むものがそのアカウントを全くリストしないということです。 –

+0

右結合は左結合である必要がありますか?ここでDaan Timmerの答えをチェックしてください:https:// stackoverflow。com/questions/4715677/difference-between-left-join-and-right-join-in-sql-server – Ben

+0

実際には、「良い」アカウントのリストを作成するために内部結合を持つサブクエリを使用し、 IN "を入力して悪いものを探します。あなたは正しい道で私を助けました! –

関連する問題