Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
它';有可能在sql中实现这一点吗?_Sql_Sql Server_Sql Server 2005 - Fatal编程技术网

它';有可能在sql中实现这一点吗?

它';有可能在sql中实现这一点吗?,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,我要做一个点餐系统 我想这样做,当所有菜肴的状态都是“完成”时,订单会自动变为“完成” 我有四张桌子 1订单 ID_订单:OR00001 状态:正在处理/自动更改为“完成” 创建日期:2017年7月17日 3道菜 1道菜 意大利面 编号:PA00001 名称:意大利米德拉面食 厨师:杰夫 ID_订单:OR00001 状态:正在进行中 2道菜沙拉 编号:SA00001 名称:减肥沙拉 厨师:阿斯顿 ID_订单:OR00001 状态:正在进行中 3盘肉 编号:ME00001 名称:肉BBF 厨师:杰

我要做一个点餐系统

我想这样做,当所有菜肴的状态都是“完成”时,订单会自动变为“完成”

我有四张桌子

1订单

ID_订单:OR00001

状态:正在处理/自动更改为“完成”

创建日期:2017年7月17日

3道菜

1道菜 意大利面

编号:PA00001

名称:意大利米德拉面食

厨师:杰夫

ID_订单:OR00001

状态:正在进行中

2道菜沙拉

编号:SA00001

名称:减肥沙拉

厨师:阿斯顿

ID_订单:OR00001

状态:正在进行中

3盘肉

编号:ME00001

名称:肉BBF

厨师:杰夫

ID_订单:OR00001

状态:正在进行中

怎么可能呢?谢谢

CREATE TABLE [dbo].[ORDER](
    [ID_OR] [int] IDENTITY(1,1) NOT NULL,
    [ID_ORDER]  AS ('OR'+right('00000'+CONVERT([varchar],[ID_OR],(0)),(5))),
    [STATUS] [datetime] NOT NULL,
    [CREATION_DATE] [datetime] NOT NULL,
 CONSTRAINT [PK_RR] PRIMARY KEY CLUSTERED 
(
    [ID_ORDER] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
END
GO

CREATE TABLE [dbo].[1_DISH](
    [ID_D1] [int] IDENTITY(1,1) NOT NULL,
    [ID_PASTA]  AS ('PA'+right('00000'+CONVERT([varchar],[ID_D1],(0)),(5))),
    [NAME] [varchar](20),
    [CHEF] [varchar](20),
    [STATUS] [datetime] NOT NULL,
    [ID_ORDER] [varchar](20)
 CONSTRAINT [PK_RR] PRIMARY KEY CLUSTERED 
(
    [ID_PASTA] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
END
GO

CREATE TABLE [dbo].[2_DISH](
    [ID_D2] [int] IDENTITY(1,1) NOT NULL,
    [ID_SALAD]  AS ('SA'+right('00000'+CONVERT([varchar],[ID_D2],(0)),(5))),
    [NAME] [varchar](20),
    [CHEF] [varchar](20),
    [STATUS] [datetime] NOT NULL,
    [ID_ORDER] [varchar](20)
 CONSTRAINT [PK_RR] PRIMARY KEY CLUSTERED 
(
    [ID_SALAD] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
END
GO

CREATE TABLE [dbo].[3_DISH](
    [ID_D3] [int] IDENTITY(1,1) NOT NULL,
    [ID_MEAT]  AS ('ME'+right('00000'+CONVERT([varchar],[ID_D3],(0)),(5))),
    [NAME] [varchar](20),
    [CHEF] [varchar](20),
    [STATUS] [datetime] NOT NULL,
    [ID_ORDER] [varchar](20)
 CONSTRAINT [PK_RR] PRIMARY KEY CLUSTERED 
(
    [ID_MEAT] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
END
GO

下面是一些可能对您有所帮助的示例代码

创建了两个表:一个用于订单,另一个用于构成订单的菜品

我在Dish表中添加了一个DishType列。 我将状态更改为
varchar
数据类型

declare @ORDERTABLE table 
(
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [STATUS] [varchar](20) NOT NULL,
    [CREATION_DATE] [datetime] NOT NULL
)

declare @DISHTABLE table
(
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [DISHTYPE] varchar(20),
    [NAME] [varchar](20),
    [CHEF] [varchar](20),
    [STATUS] [varchar](20) NOT NULL,
    [ID_ORDER] int
)
插入一些示例数据

insert @ORDERTABLE (STATUS, CREATION_DATE) values
('IN PROCESS', getdate()),
('IN PROCESS', getdate());

insert @DISHTABLE (DISHTYPE, NAME, CHEF, STATUS, ID_ORDER) values
('PASTA','PASTA MIDELA','JEFF','IN PROCESS',1),
('SALAD','DIET SALAD','KIA','IN PROCESS',1),
('MEAT','MEAT BBF','BART','IN PROCESS',1),
('SALAD','CAESAR SALAD','KIA','IN PROCESS',2),
('MEAT','ROAST CHICKEN','BART','IN PROCESS',2);

update @DISHTABLE set STATUS = 'COMPLETE' where ID = 1;
update @DISHTABLE set STATUS = 'COMPLETE' where ID = 2;
update @DISHTABLE set STATUS = 'COMPLETE' where ID = 3;

select * from @DISHTABLE;
自动更改订单状态的一种简单方法:每当您更改一道菜的状态时,检查订单中有多少道菜,以及完成了多少道菜。如果所有菜肴都已完成,则将订单状态也更改为“完成”

declare @ORDERID int = 1;

update @ORDERTABLE 
    set STATUS = 'COMPLETE' 
where 
    ID = @ORDERID 
    and (select count(*) from @DISHTABLE where ID_ORDER = @ORDERID) = (select count(*) from @DISHTABLE where ID_ORDER = @ORDERID and STATUS = 'COMPLETE');


select 
    o.ID, 
    DISHES = (select count(*) from @DISHTABLE where ID_ORDER = o.ID),
    COMPLETED = (select count(*) from @DISHTABLE where ID_ORDER = o.ID and STATUS = 'COMPLETE'),
    o.STATUS
from @ORDERTABLE o;

我不想评判你的设计,但我认为如果你把3道菜的桌子组合成一张桌子会更好。如果你真的特别喜欢数字,只需添加一栏,例如1号、2号或3号。您可以触发检查这3个表的状态,并在全部完成时更新订单表的状态。我同意Martono的观点——您可能会考虑只为一个表设置一个外键,用于“Dish”或“Item”。有很多方法可以使[订单]保持最新。老实说,我可能会1)使用存储过程更新我的菜肴,并将测试作为最后一步并相应地更新订单,或者2)从[order]中删除[Status]列,创建一个名为[OrderView]或[OrderInfo]的视图在读取时,非常简单的是完整的逻辑。首先确定您的实体和属性、实体之间的关系、规范化等。检查此链接以了解基本的数据库设计转储(我几乎不敢称之为)数据模型。如果点了第四道菜,没有甜点怎么办?你从来没有期望超过99999个订单?没有外键,为什么要使用ID_顺序而不是标识链接?