SQL server:根据关键字匹配删除结果

时间:2017-05-31 19:43:45

标签: sql-server database

所有。

我有一个财务交易数据库,其中帐户可以有多行。称之为TableA。

我有另一个日常代表活动数据库,其中帐户可以有多行。这是TableB。

如果TableA中的某个帐户在TableB中具有某种特定的活动类型而没有特定的活动类型,则该帐户违规并且需要显示在报告中。

TableB中正确的活动类型包含字符串"%roll%"在标题字段中。因此,我希望在TableA中显示所有具有事务类型X的帐户,但不显示包含"%roll%"的活动标题。在表B中。

我遇到的问题是,当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  

2 个答案:

答案 0 :(得分:0)

你的问题有点泛泛 - 所以我会提供一个相当通用的答案。

有一个“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.

通常,如果您不需要显示TableB中的信息,请不要将其包含在FROM中,而是将其用作WHERE或JOIN中的过滤器。引入数据会增加服务器需要完成的工作。但是,如果您的查询需要TableB和TableA中的数据,则无论如何都要加入它们而不使用IN谓词。如果您公开了一个已清理的模式或提供了一些示例查询,那将会很有帮助。

感谢您添加您的作品 - 它仍然有点缺乏,但我认为我得到了足够的帮助。继续前进,当您在Stack Overflow上发布时,首先要显示问题的示例以及您尝试过的尝试的代码,这样您就不会投票。 FWIW - 我不会投票问题,只是在他们拖钓时才回答。

让我知道这个方向是否有助于你。性能问题可以在其他线程中解决,但这应该更接近于获得您正在寻找的结果。

答案 1 :(得分: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%'