SQL server:删除基于关键字匹配的结果全部
我有一个帐户可以有多个行的金融交易数据库。称之为TableA。
我有另一个日常代表活动的数据库,其中帐户可以有多行。这是TableB。
当TableA中的帐户在TableB中具有某种特定的交易类型而没有特定的交易类型时,它违规并需要出现在报告中。
TableB中正确的活动类型在标题字段中包含字符串“%roll%”。因此,我想要显示TableA中所有具有交易类型X的帐户,但在TableB中没有包含“%roll%”的活动标题。
我遇到的问题是当TableB中的帐户具有活动类型“%roll%”,这使得它成为一个好帐户,如果该帐户具有其他活动类型,它会显示在我的结果集中。我如何从结果中排除好账户?
这是当前查询:
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
你的问题有点通用 - 所以我会提供一个比较通用的答案。
有一个“IN”谓词,你可以用NOT来反转。喜欢的东西:
SELECT
ta.*
FROM
TableA AS ta
WHERE
ta.accountId NOT IN (SELECT tb.accountId FROM TableB AS tb WHERE title LIKE '%roll%')
使用NOT IN的概念,它会适合在这里查询:
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.
一般来说,如果你不需要从表B显示的信息,不包括它在你的FROM中,但将它用作你的WHERE或JOIN中的过滤器。引入数据增加了服务器需要完成的工作。但是,如果您的查询需要来自TableB和TableA的数据,则通过所有方式在没有IN谓词的情况下加入它们。如果您公开了一个清理过的模式或提供了一些示例查询,这将会很有帮助。
感谢您添加您的工作 - 它仍然有点欠缺,但我认为我已经足够帮助了。展望未来,当您在Stack Overflow上发布信息时,首先展示您尝试过的尝试的问题和代码示例,以便您不会被拒绝投票。 FWIW--我不会降低问题的质量,只是在他们正在拖动的时候回答。
让我知道这个方向是否帮助你。在其他线程中可以解决的性能问题,但这应该更接近于让你找到你想要的结果。
添加当前查询以发布。 –
正如我在@ Ben的回复中评论的那样,我使用了一个带有内部联接的子查询来创建“好”帐户列表,然后使用“NOT IN”找到不好的帐户。你帮助我走上正轨! –
如果你想使用一个连接:
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%'
我将当前的代码添加到主帖子中。我基本上做了你的建议,但问题是,如果TableB除了“%roll%”之外还有ActivityType,当我想要的是根本不列出该帐户时,我会得到这些行。 –
正确的连接是否需要左连接?查看Daan Timmer的答案:https:// stackoverflow。com/questions/4715677/left-join-and-right-join-in-sql-server – Ben
实际上我使用了一个带有内部联接的子查询来创建“好”帐户列表,然后使用“NOT IN“找到坏的。你帮助我走上正轨! –
你能告诉我们的表模式和样本数据? –
更新了主帖。 –