首先你需要规范化,这方面有很多东西,但是大量的教程试图采取一些常识并让它变得非常模糊
看着你的列名,我看到三个表
客户(客户 ID、客户名称、客户地址)
CustomerOrders(OrderID, CustomerID, SellDate, ProductNumber) 尽量不要将您的表和列命名为 Sql 关键字之类的相同名称。
产品(ProductNumber, ProductDescription)
规范化表示,您应该能够唯一标识表中的任何记录,您可以使用 OrderId。当我拆分表格时,我添加了 CustomerID,因为您可能有多个同名客户。
另一个简单的规则是在您的结构中,如果您有多个客户订单,您将多次存储他们的姓名和地址,这是一种浪费,但真正的问题是,如果该客户更改地址怎么办?如何找到要更改的行,您可以执行 Where name = "Fred" 和 Address = "Here",但您不知道是否有多个客户名为 Fred,地址为 Here。
所以你的第一个查询将是一个连接
Select Customers.CustomerName,Customers.CustomerAddress From Customers
Inner join CustomerOrders On Customers.CustomerID = CustomerOrders.CustomerID
Where CustomerOrders.OrderID = 7
或者,如果您现在想跳过过去的学习连接,您可以使用两个查询来完成
Select CustomerID From CustomerOrders Where OrderID = 7
然后
Select CustomerName,CustomerAddress From Customers Where CustomerID = ?
您应该使用连接,但您可能会发现子查询更容易让您了解情况。您可以同时执行这两个查询
Select CustomerID From CustomerOrders
Where CustomerID In (Select CustomerID From CustomerOrders Where OrderID = 7)
不知道您对 sql 表创建的了解有多远,但主键和外键是要查看的两件事。这将使您可以在数据库中放置一些规则。CustomerOrders 上的主键将阻止您拥有两个具有相同 ID 的订单,这很糟糕。
外键会阻止您为不存在的客户创建 CustomerOrder,并阻止您为不存在的产品创建产品。
假设您沿着这条路线走,并且您正在寻找编写一个应用程序来订购东西。
您可能具有维护客户的功能,该功能会向他们添加类似的内容
Insert Into Customers(CustomerID,CustomerName,CustomerAddress) Values(1,'Fred Bloggs','England')
还有一个产品
Insert Into Products(ProductNumber,ProductDescription) Values(1,'A thingamabob')
然后你会选择一个客户,所以你有它的 id,选择一个产品,所以你有它的编号,所以你不需要弄乱 CustomerName、CustomerAddress 或 ProductDescription
和
Insert Into CustomerOrders(OrderID,CustomerID,ProductNumber,SellDate) Values(1,1,1,'20121017')
请注意日期格式,如果您要将日期作为字符串传递给 sql,(另一个主题)在 YYYYMMDD 中执行它们,当您通过选择将它们取出时,您将以机器/数据库的格式获取它们设置在您的情况下似乎是 mm/dd/yyyy。问题是我推断出这是因为我知道一年只有十二个月。(使我成为高级开发人员的原因之一 :) 如果您的示例销售日期是 2012 年 1 月 5 日,我会读到 5 月 1 日,因为我已配置为英语。不惜一切代价避免这种歧义,它会定期影响你并伤害你。
PS 你在 2012 年 1 月 15 日所做的方式将被视为数学表达式,如 1 除以 15 ...
所以你不能写一个连接的原因基本上是你只有一个表。加入是将一个表连接到另一个表。好吧,实际上它比这要复杂一些,但这是超越学习曲线的好方法。
至于移动数据,我应该更快地重新开始。您不太可能创建了两个具有相同名称的不同客户,但移动数据的查询必须考虑到您可能拥有的情况。
要移动数据,假设 CustomerID 是Identity
(自动编号)列
就像是
Insert into Customers(CustomerName,CustomerAddress)
Select Distinct CustomerName,CustomerAddress From [Order]
会为客户做这项工作。
那么对于产品
Insert into Products(ProductDescription)
Select Distinct ProductDescription From [Order]
然后
Insert into CustomerOrders(OrderID,CustomerID,ProductNumber,SellDate)
Select old.OrderID,c.CustomerID,p.ProductNumber,old.SellDate
From [Order] old
Inner Join Products p On p.ProductDesription = old.ProductDescription
Inner Join Customers c On c.CustomerName = old.CustomerName And c.CustomerAddress = old.CustomerAddress
我认为可能会做 CustomerOrders