SQL不在子查询中?

SQL不在子查询中?,sql,sql-server,tsql,sql-server-2000,subquery,Sql,Sql Server,Tsql,Sql Server 2000,Subquery,因此,我为一位同事编写了以下查询(见下文): SELECT t.tender_id as "Tender ID", t.check_number as "Check Number", t.check_type_id as "Check Type", t.server_id as "Server ID", t.cashier_id as "Cashier ID", t.terminal_id as "T

因此,我为一位同事编写了以下查询(见下文):

SELECT
        t.tender_id as "Tender ID",
        t.check_number as "Check Number",
        t.check_type_id as "Check Type",
        t.server_id as "Server ID",
        t.cashier_id as "Cashier ID",
        t.terminal_id as "Terminal ID",
        t.tendered_date_time as "Tendered Date and Time",
        t.tender_amount as "Tender Amount",
        t.change_amount as "Change Amount",
        g.account_name as "Account Name",
        g.account_number as "Account Number"
FROM CheckTender AS t
INNER JOIN AcountActivity AS g
        ON t.check_number = g.check_number
WHERE t.tender_id NOT in (5,14,4,9,15,16);
支票号码可以有多个投标ID。例如,支票编号20001可以有三行,都有不同的投标ID

最初,他只想删除投标id为
5,14,4,9,15,16
的任何条目。但是后来我们发现我们需要修改where标准


需要对其进行更新,以便在支票编号的投标ID为
5,14,4,9,15,16
时,删除该支票编号的所有实例。我知道这很可能是一个子查询,但我整个上午都在拼命地想它,却没有弄明白(

您可以为此使用
EXISTS

SELECT
        t.tender_id as "Tender ID",
        t.check_number as "Check Number",
        t.check_type_id as "Check Type",
        t.server_id as "Server ID",
        t.cashier_id as "Cashier ID",
        t.terminal_id as "Terminal ID",
        t.tendered_date_time as "Tendered Date and Time",
        t.tender_amount as "Tender Amount",
        t.change_amount as "Change Amount",
        g.account_name as "Account Name",
        g.account_number as "Account Number"
FROM CheckTender AS t
INNER JOIN AcountActivity AS g
        ON t.check_number = g.check_number
WHERE NOT EXISTS (  SELECT * FROM CheckTender WHERE check_number =  t.check_number
                    AND tender_id in (5,14,4,9,15,16))

您可以为此使用
EXISTS

SELECT
        t.tender_id as "Tender ID",
        t.check_number as "Check Number",
        t.check_type_id as "Check Type",
        t.server_id as "Server ID",
        t.cashier_id as "Cashier ID",
        t.terminal_id as "Terminal ID",
        t.tendered_date_time as "Tendered Date and Time",
        t.tender_amount as "Tender Amount",
        t.change_amount as "Change Amount",
        g.account_name as "Account Name",
        g.account_number as "Account Number"
FROM CheckTender AS t
INNER JOIN AcountActivity AS g
        ON t.check_number = g.check_number
WHERE NOT EXISTS (  SELECT * FROM CheckTender WHERE check_number =  t.check_number
                    AND tender_id in (5,14,4,9,15,16))
像这样的(未经测试)

像这样的(未经测试)


下面是一种使用窗口功能执行此操作的方法:

select *
from (SELECT
             t.tender_id as "Tender ID",
             t.check_number as "Check Number",
             t.check_type_id as "Check Type",
             t.server_id as "Server ID",
             t.cashier_id as "Cashier ID",
             t.terminal_id as "Terminal ID",
             t.tendered_date_time as "Tendered Date and Time",
             t.tender_amount as "Tender Amount",
             t.change_amount as "Change Amount",
             g.account_name as "Account Name",
             g.account_number as "Account Number",
             MAX(case when t.tender_id in (5,14,4,9,15,16) then 1 else 0 end) over (partition by t.check_number) as HasBadTender
      FROM CheckTender AS t
      INNER JOIN AcountActivity AS g
                 ON t.check_number = g.check_number
     ) t
where HasBadTender = 0
这适用于SQL Server 2005及更高版本。对于早期版本,您需要某种形式的联接或关联子查询

对原始where条款的轻微修改也适用:

WHERE t.check_number not in (select check_number from CheckTender where tender in (5,14,4,9,15,16))

下面是一种使用窗口功能执行此操作的方法:

select *
from (SELECT
             t.tender_id as "Tender ID",
             t.check_number as "Check Number",
             t.check_type_id as "Check Type",
             t.server_id as "Server ID",
             t.cashier_id as "Cashier ID",
             t.terminal_id as "Terminal ID",
             t.tendered_date_time as "Tendered Date and Time",
             t.tender_amount as "Tender Amount",
             t.change_amount as "Change Amount",
             g.account_name as "Account Name",
             g.account_number as "Account Number",
             MAX(case when t.tender_id in (5,14,4,9,15,16) then 1 else 0 end) over (partition by t.check_number) as HasBadTender
      FROM CheckTender AS t
      INNER JOIN AcountActivity AS g
                 ON t.check_number = g.check_number
     ) t
where HasBadTender = 0
这适用于SQL Server 2005及更高版本。对于早期版本,您需要某种形式的联接或关联子查询

对原始where条款的轻微修改也适用:

WHERE t.check_number not in (select check_number from CheckTender where tender in (5,14,4,9,15,16))

所以,找到那些投标ID下的支票号码,省略那些支票号码。找到那些投标ID下的支票号码,省略那些支票号码。