类似这样的:
create table orders
(
orderID int,
orderName varchar(50),
orderDate datetime,
isValidOrderFlag bit
)
create table orderdetail
(
orderdetailID int,
orderID int,
productName varchar(100),
productCost numeric(9,2),
quantity int,
isCancelled bit
)
insert into orders values (1234, 'Bob Garvey', GETDATE() - 5, 0);
insert into orders values (1235, 'Susan Hamilton', GETDATE() - 5, 0);
insert into orders values (1236, 'Bob Garvey', GETDATE() - 5, 0);
insert into orders values (1237, 'Sarah Smith', GETDATE() - 4, 0);
-- all 3 order items are cancelled do not update orders flag
insert into orderdetail values (10000, 1234, 'thing1', 9.95, 10, 1);
insert into orderdetail values (10001, 1234, 'thing2', 5.99, 10, 1);
insert into orderdetail values (10002, 1234, 'thing3', 1.99, 1, 1);
-- at least one order is cancelled update orders flag
insert into orderdetail values (10000, 1235, 'thing1', 9.95, 10, 1);
insert into orderdetail values (10001, 1235, 'thing2', 5.99, 10, 0);
insert into orderdetail values (10002, 1235, 'thing3', 1.99, 1, 0);
-- at least one order is cancelled update orders flag
insert into orderdetail values (10000, 1236, 'thing1', 9.95, 10, 1);
insert into orderdetail values (10001, 1236, 'thing2', 5.99, 10, 1);
insert into orderdetail values (10002, 1236, 'thing3', 1.99, 1, 0);
-- no orders are cancelled dupdate orders flag
insert into orderdetail values (10000, 1237, 'thing1', 9.95, 10, 0);
insert into orderdetail values (10001, 1237, 'thing2', 5.99, 10, 0);
insert into orderdetail values (10002, 1237, 'thing3', 1.99, 1, 0);
select orderid, max(iscancelled)
from orderdetail
group by orderid
--count detail items
update o
set isvalidorderflag = 1
from
dbo.orders o
join
(
select orderid
, count(*) [total_lines]
, sum(case when iscancelled = 1 then 1 else 0 end) [total]
from orderdetail
group by orderid) main on main.orderid = o.orderid
where
main.total_lines <> main.total