Sql 返回值的正确方法
在这种情况下,如果并且只有一个成员在Members\u transaction表中没有事务,我希望从Members表中删除该成员 我还想知道该会员是否有任何交易。当前,我将返回一个值为1的列,以指示该成员至少存在一个事务,或返回值为0,以指示该成员没有事务,并且在执行此查询时已被删除。我的质询如下:Sql 返回值的正确方法,sql,sql-server,Sql,Sql Server,在这种情况下,如果并且只有一个成员在Members\u transaction表中没有事务,我希望从Members表中删除该成员 我还想知道该会员是否有任何交易。当前,我将返回一个值为1的列,以指示该成员至少存在一个事务,或返回值为0,以指示该成员没有事务,并且在执行此查询时已被删除。我的质询如下: IF EXISTS ( SELECT members_trans_id FROM MEMBERS_TRANSACTION WHERE member_link_id =
IF EXISTS
(
SELECT members_trans_id
FROM MEMBERS_TRANSACTION
WHERE member_link_id = 188
)
SELECT 1
ELSE
DELETE FROM Members WHERE member_link_id = 188;
SELECT 0
我关心的是ELSE块中的两行。我可以在SQLServerManagementStudio中毫无问题地执行此查询,但我想知道这样编写是否正确
我正在使用SQLServer2008R2
谢谢。左会合是您的朋友,速度非常快。要查看所有成员及其交易记录,请执行以下操作:
select m.Name, count(*) As TotalTransactions
from Member m
LEFT JOIN MEMBERS_TRANSACTION mt on mt.member_link_id=m.member_link_id
where mt.member_link_id is null
GROUP BY m.Name
ORDER BY m.Name
要仅查找没有事务的事务,请在末尾添加一个HAVING COUNT*=0
要干掉那些偷懒的人:
delete m
from Member m
LEFT JOIN MEMBERS_TRANSACTION mt on mt.member_link_id=m.member_link_id
where mt.member_link_id is null
我假设你想为所有成员做这件事。显然,对于单个查询,在where子句中添加它们的ID。当您加入或提供子查询时,从这两个查询中都可以实现这一点。很好的使用连接 在SQLServer2008中,介绍在这种情况下非常好的 当我们使用以下内容时,也请阅读有关basic的好文章:- 及 删除此查询前始终使用“选择查询”
create table Members (member_link_id int , name varchar(50))
create table MEMBERS_TRANSACTION ( members_trans_id int , member_link_id int, name varchar(50))
insert into Members values(188,'abc'),(189,'abc1'),(190,'abc2'),(192,'abc3'),(193,'abc4')
insert into MEMBERS_TRANSACTION values(1,189,'abc'),(2,190,'abc1')
/*for select with left outer join to understand better*/
select * from Members m left outer join MEMBERS_TRANSACTION mt on m.member_link_id = mt.member_link_id
-/*1st approach*/
select * from Members m
where not exists ( select members_trans_id from MEMBERS_TRANSACTION mt where m.member_link_id = mt.member_link_id )
and member_link_id = 188
select * from Members m
where not exists ( select members_trans_id from MEMBERS_TRANSACTION mt where m.member_link_id = mt.member_link_id )
and member_link_id = 189
/*2nd approach with merge option, it is give error*/
MERGE Members AS m
USING (SELECT member_link_id FROM MEMBERS_TRANSACTION ) AS mt
ON mt.member_link_id = m.member_link_id
WHEN MATCHED THEN
SELECT * from Members
WHEN NOT MATCHED THEN
SELECT * from Members where m.member_link_id = 188
drop table member
drop table MEMBERS_TRANSACTION
只需尝试删除并检查SQL Server返回的修改行数:
DELETE FROM Members
WHERE member_link_id = 188 AND NOT EXISTS (
SELECT *
FROM MEMBERS_TRANSACTION
WHERE member_link_id = 188
)
我建议在T-SQL中使用尽可能少的过程逻辑。C语言处理逻辑的能力更强。我试图在一个查询(即一个数据库调用)中实现这一点。至于您给我的第二个查询,它将按成员链接id删除所选成员,即使该成员在成员事务表中有事务。很抱歉,第二个查询中存在语法错误。另一方面,第一个查询删除其成员链接id不是188的所有成员。这不是我要找的。我正在寻找一种方法来删除其成员链接id为188的成员,当且仅当该成员没有事务时。我还想知道此查询执行的结果,该成员是否已被删除,或由于现有事务尚未被删除亲爱的,请给我10分钟时间修改此内容