SQL Server 2014 一对多问题
SQL Server 2014 one to many issue
我有 2 个表格,Orders 和 AWB
付款后,订单即成为发票并生成运单
在订单中,我在每条记录上都有一个标志 'HOLD'
订单通常是 1 个项目,因此是 1 条记录,但有时订单的行数更多
我希望当它发生时,至少有一个订单被搁置,整个装运被阻止
但是正如您从这个 SQLFiddle 中看到的那样,我的 solution
要求所有 3 个订单行都处于暂停状态以停止 AWB
我怎样才能达到我所需要的?
更新.. sqlFiddle 不能正常工作:这里是示例
CREATE TABLE Orders (
OrderID varchar(10) NULL,
UserID nvarchar(20) NULL,
ItemID nvarchar(20) NULL,
Quantity int NULL,
Hold bit NULL
)
CREATE TABLE AWB (
ShipmentID varchar(10) NULL,
OrderID varchar(10) NULL,
UserID nvarchar(20) NULL,
Content nvarchar(200) NULL,
TrackingID nvarchar(20) NULL
)
Insert into Orders (OrderID,UserID,ItemID,Quantity,Hold)
VALUES ('25', 'John', 'Item2',1,0)
Insert into Orders (OrderID,UserID,ItemID,Quantity,Hold)
VALUES ('26', 'Frank', 'Item3',1,0)
Insert into Orders (OrderID,UserID,ItemID,Quantity,Hold)
VALUES ('25', 'John', 'Item3',2,0)
Insert into Orders (OrderID,UserID,ItemID,Quantity,Hold)
VALUES ('25', 'John', 'Item4',1,1)
Insert into Orders (OrderID,UserID,ItemID,Quantity,Hold)
VALUES ('27', 'Bill', 'Item1',2,0)
Insert into Orders (OrderID,UserID,ItemID,Quantity,Hold)
VALUES ('28', 'Anna', 'Item3',4,0)
Insert into AWB (ShipmentID,ORderID,UserID,Content,TrackingID)
VALUES ('A414', '26', 'Frank', '1xItem3', 'DHL232455')
Insert into AWB (ShipmentID,ORderID,UserID,Content,TrackingID)
VALUES ('A415', '25', 'John', '4xItem1,1xItem2,2xItem3,1xItem4', 'DHL232465')
Insert into AWB (ShipmentID,ORderID,UserID,Content,TrackingID)
VALUES ('A416', '26', 'Bill', '2xItem1', 'DHL232467')
Insert into AWB (ShipmentID,ORderID,UserID,Content,TrackingID)
VALUES ('A417', '26', 'Anna', '4xItem3', 'DHL232489')
SELECT DISTINCT
awb.ShipmentID,
awb.OrderID,
awb.UserID,
awb.Content,
awb.TrackingID
FROM
AWB
JOIN
Orders o ON o.OrderID=awb.OrderID
WHERE
o.Hold=0
我希望在这种情况下 select 不会 return Order 25
谢谢!
乔
使用这个 where 子句:
where o.OrderID not in (select OrderID from Orders where Hold=1)
为了加快速度,您可以放弃订单连接并直接在 awb.OrderID
上进行过滤
where awb.OrderID not in (select OrderID from Orders where Hold=1)
添加 not exists in where 子句 -
SELECT DISTINCT
awb.ShipmentID,
awb.OrderID,
awb.UserID,
awb.Content,
awb.TrackingID
FROM
AWB
JOIN
Orders o ON o.OrderID=awb.OrderID
WHERE
o.Hold=0
and not exists (select 1 from Orders od where od.OrderID = o.OrderID and od.Hold = 0 group by od.OrderID having count(*) > 1)
我有 2 个表格,Orders 和 AWB
付款后,订单即成为发票并生成运单
在订单中,我在每条记录上都有一个标志 'HOLD'
订单通常是 1 个项目,因此是 1 条记录,但有时订单的行数更多
我希望当它发生时,至少有一个订单被搁置,整个装运被阻止
但是正如您从这个 SQLFiddle 中看到的那样,我的 solution
要求所有 3 个订单行都处于暂停状态以停止 AWB
我怎样才能达到我所需要的?
更新.. sqlFiddle 不能正常工作:这里是示例
CREATE TABLE Orders (
OrderID varchar(10) NULL,
UserID nvarchar(20) NULL,
ItemID nvarchar(20) NULL,
Quantity int NULL,
Hold bit NULL
)
CREATE TABLE AWB (
ShipmentID varchar(10) NULL,
OrderID varchar(10) NULL,
UserID nvarchar(20) NULL,
Content nvarchar(200) NULL,
TrackingID nvarchar(20) NULL
)
Insert into Orders (OrderID,UserID,ItemID,Quantity,Hold)
VALUES ('25', 'John', 'Item2',1,0)
Insert into Orders (OrderID,UserID,ItemID,Quantity,Hold)
VALUES ('26', 'Frank', 'Item3',1,0)
Insert into Orders (OrderID,UserID,ItemID,Quantity,Hold)
VALUES ('25', 'John', 'Item3',2,0)
Insert into Orders (OrderID,UserID,ItemID,Quantity,Hold)
VALUES ('25', 'John', 'Item4',1,1)
Insert into Orders (OrderID,UserID,ItemID,Quantity,Hold)
VALUES ('27', 'Bill', 'Item1',2,0)
Insert into Orders (OrderID,UserID,ItemID,Quantity,Hold)
VALUES ('28', 'Anna', 'Item3',4,0)
Insert into AWB (ShipmentID,ORderID,UserID,Content,TrackingID)
VALUES ('A414', '26', 'Frank', '1xItem3', 'DHL232455')
Insert into AWB (ShipmentID,ORderID,UserID,Content,TrackingID)
VALUES ('A415', '25', 'John', '4xItem1,1xItem2,2xItem3,1xItem4', 'DHL232465')
Insert into AWB (ShipmentID,ORderID,UserID,Content,TrackingID)
VALUES ('A416', '26', 'Bill', '2xItem1', 'DHL232467')
Insert into AWB (ShipmentID,ORderID,UserID,Content,TrackingID)
VALUES ('A417', '26', 'Anna', '4xItem3', 'DHL232489')
SELECT DISTINCT
awb.ShipmentID,
awb.OrderID,
awb.UserID,
awb.Content,
awb.TrackingID
FROM
AWB
JOIN
Orders o ON o.OrderID=awb.OrderID
WHERE
o.Hold=0
我希望在这种情况下 select 不会 return Order 25
谢谢! 乔
使用这个 where 子句:
where o.OrderID not in (select OrderID from Orders where Hold=1)
为了加快速度,您可以放弃订单连接并直接在 awb.OrderID
上进行过滤where awb.OrderID not in (select OrderID from Orders where Hold=1)
添加 not exists in where 子句 -
SELECT DISTINCT
awb.ShipmentID,
awb.OrderID,
awb.UserID,
awb.Content,
awb.TrackingID
FROM
AWB
JOIN
Orders o ON o.OrderID=awb.OrderID
WHERE
o.Hold=0
and not exists (select 1 from Orders od where od.OrderID = o.OrderID and od.Hold = 0 group by od.OrderID having count(*) > 1)