我很简单 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。

谢谢,

有帮助吗?

解决方案

您与客户和地址之间有一对多关系,因此我将地址拉到带有“类型”的单独表格中,以区分它们。我会考虑将地址本身分为单独的属性。可选地,您甚至可以为有效的城市/州/国家/地区添加参考表。

alt text

至于查询此结构中的数据,假设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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top