我有一个问题是可以在表中设置一个日期NULL(在我的情况下,一个shipdate不存在)?我有 以下表格:
Customer{cid,name}
Product{prodno,name}
Order{orderid, shipdate, cid}
Ordered{orderid, prodno, quantity}
现在我想要获得所有从未订购过的产品。 所以我在RA(关系代数)中创建它:
πP.name,P.prodno(σO.cid = C.cid AND Order.shipdate is NULL(Order)))⋈Customer)
我确信它在SQL查询中看起来:
SELECT P.Name, P.Prodno
FROM CUSTOMERS C, Order O E, Ordered Ordd Product P
WHERE O.CID = C.CID
AND O.shipdate is Null
所以我认为如果可以在SQL中使用日期,那么我可以获得所有未订购的产品。也许有可能用表来订购但是如果我检查Order.orderid是否不等于Ordered.orderid并且Porduct.prodno不等于Ordered.prodno也不确定如何在RA中创建它。但是仅仅为了获得产品是复杂的,所以我认为我的RA和SQ可能是正确的还是?
2.更新
SELECT prodno, name
FROM Products P, Order O Ordered Ordd
WHERE prodno NOT IN (
SELECT prodno FROM Ordered
但是如何创建RA?
答案 0 :(得分:0)
除了您想知道每个客户从未订购过的产品之外,没有必要使用表CUSTOMER,只是让订单没有订购。
在SQL中
SELECT Prodno
FROM Products
WHERE Prodno NOT IN (SELECT Prodno
FROM Ordered)
或等效的
SELECT Prodno
FROM Products
EXCEPT
SELECT Prodno
FROM Ordered
答案 1 :(得分:0)
是的,尽管表模式必须将列声明为可为空。如果您要创建新表格,则需要执行类似
的操作create table Order
(
order_id int not null primary key ,
ship_date datetime null ,
...
)
如果您要修改现有表格,则需要像
这样的魔术咒语alter table Order alter column shop_date datetime null
确切的语法可能会有所不同,具体取决于您的特定SQL风格。
答案 2 :(得分:0)
显然产品(prodno,name)的意思是“产品[prodno]被命名为[name]”和Ordered(orderid,prodno,quantity)意味着“order [orderid]是指产品[prodno]的数量[数量]”。但你需要明确这样的含义。
检查Order.orderid是否不等于Ordered.orderid和 Porduct.prodno不等于Ordered.prodno
这还不足以说明问题的原因。条件并不总是与选择相对应。努力找到你想要的清晰,完整的自然语言描述。有序产品是有序产品和无序产品中出现的产品是仅出现在产品中的产品。显然你想要prodno和无序产品的名称。
我们使用代数减法来从另一个中移除关系的元组。但是减法参数需要相同的属性。产品的prodnos是πprodno产品和订购产品的prodnos是πprodnoOrdered。所以无序prodnos是πprodno产品 - πprodnoOrdered。但是你想要产品的prodno和名称与那些prodnos:
(π prodno Product - π prodno Ordered) ⋈ Product
这不涉及客户。
这不涉及订单或其发货日期。 (不要将已发货的产品与订购的产品混淆。)
但是,您的问题主题涉及日期和NULL。所以我可能没有理解你的问题。如果Order shipdate可以为空,那么这是一个不同的问题。 (您必须确定哪些关系对应于具有NULL的SQL表,并且在代数运算符和SQL运算符之间进行转换时必须使用NULL。)