SQL:船舶/发票地址的表设计,然后选择Concat问题
-
09-10-2019 - |
题
我很简单 customers
表设计了这种方式(我只报告一些字段,有关此Qeustions的字段):
+ ----------- + --------------- + ---------------- +
+ customer_id + invoice_address + ship_address +
+ ----------- + --------------- + ---------------- +
+ 33 + 234, Walnut Ave + null +
+ ----------- + --------------- + ---------------- +
+ 47 + 66, Smart Ave + null +
+ ----------- + --------------- + ---------------- +
+ 47 + 4, Cool Ave + 45, Dark Street +
+ ----------- + --------------- + ---------------- +
带有null Ship_address的行意味着我们还必须使用客户的发票地址进行运输。
第一个问题: 这是一个足够好的设计,还是应该所有的 null
ship_address
字段中充满了发票地址(即使相同),但不留下 null
.
第二个问题: 保持这样的设计(即使是不良设计),我如何创建一个选择查询(如果可能的话),该查询始终返回每行的一个地址: ship_address
什么时候没有 null
, ,否则只是 invoice_address
, , 就像是:
SELECT CONCAT_IF_SHIP_ADDRESS_NOT_NULL_OTHERWISE_USE_ONLY_SHIP_ADDRESS(invoice_address, ship_address) AS address FROM customers;
查询MySQL DB。
谢谢,
解决方案
您与客户和地址之间有一对多关系,因此我将地址拉到带有“类型”的单独表格中,以区分它们。我会考虑将地址本身分为单独的属性。可选地,您甚至可以为有效的城市/州/国家/地区添加参考表。
至于查询此结构中的数据,假设1个地址始终存在,并且您可以按所需订单创建地址类型记录(即,发票= 1,运输= 2):
select c.CustomerID, a.AddressLine1, a.AddressLine2, a.AddressLine3,
a.City, a.State, a.PostalCode, a.Country
from Customer c
inner join (select MIN(cax.AddressTypeID) as MinAddressTypeID
from CustomerAddressXref cax
where cax.CustomerID = c.CustomerID
group by cax.CustomerID) mincax
inner join CustomerAddressXref cax
on c.CustomerID = cax.CustomerID
and mincax.MinAddressTypeID = cax.AddressTypeID
inner join Address a
on cax.AddressID = a.AddressID
其他提示
我认为模式很好。如果您正在使用MS SQL Server,则可以使用CoaleSce,例如:
select coalesce(ship_address,invoice_address) as address
from customers
Cocce基本上获取项目列表,并显示列表中的第一个项目,这些项目不是无效的。
这会做到
SELECT customer_id, ISNULL(ship_address,invoice_address) AS address
FROM customers
您应该离开船舶地址为null,因为复制发票地址将导致冗余。
至于查询:
SELECT invoice_address
from table
where ship_address IS Null
UNION
SELECT ship_address
from table
where ship_address IS NOT NULL
不隶属于 StackOverflow