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下的支票号码,省略那些支票号码。