1

このように設計された単純なcustomersテーブルがあります(この質問に関するフィールドのみを報告します):

+ ----------- + --------------- + ---------------- +
+ customer_id + invoice_address + ship_address     +
+ ----------- + --------------- + ---------------- +
+ 33          + 234, Walnut Ave + null             +
+ ----------- + --------------- + ---------------- +
+ 47          + 66, Smart Ave   + null             +
+ ----------- + --------------- + ---------------- +
+ 47          + 4, Cool Ave     + 45, Dark Street  +
+ ----------- + --------------- + ---------------- +

行の ship_address が null の場合は、配送にも顧客の請求先住所を使用する必要があることを意味します。


1 番目の質問:これで十分な設計ですか、それともすべてのnull ship_addressフィールドに請求書の住所 (同一であっても) を入力し、残すべきではありませんnull

2 番目の質問:ship_addressそのような設計を維持する (設計が悪い場合でも)、行ごとに常に 1 つのアドレスを返す SELECT クエリを (可能であれば) 作成するにはどうすればよいですnullinvoice_address?

SELECT CONCAT_IF_SHIP_ADDRESS_NOT_NULL_OTHERWISE_USE_ONLY_SHIP_ADDRESS(invoice_address, ship_address) AS address FROM customers;

MySQL DB のクエリ。

ありがとう、

4

4 に答える 4

3

スキーマは問題ないと思います。ms sqlサーバーを使用している場合は、次のようにcoalesceを使用できます。

select coalesce(ship_address,invoice_address) as address 
from customers

合体は基本的に項目のリストを取り、リスト内の null でない最初の項目を表示します。

于 2010-12-13T19:24:02.950 に答える
2

顧客と住所の間には 1 対多の関係があるため、それらを区別するための「タイプ」を持つ別のテーブルに住所を引き出します。アドレス自体を個別の属性に分割することを検討します。必要に応じて、有効な都市/州/国の参照テーブルを追加することもできます。

代替テキスト

この構造のデータのクエリに関しては、常に 1 つの住所が存在し、必要な順序で AddressType レコードを作成すると仮定します (つまり、Invoice=1、Shipping=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
于 2010-12-13T19:44:53.253 に答える
1

これで十分です

SELECT customer_id, ISNULL(ship_address,invoice_address) AS address
FROM customers
于 2010-12-13T19:24:52.167 に答える
1

請求書の住所をコピーすると重複が発生するため、出荷先住所は空白のままにしておく必要があります。

クエリは次のとおりです。

SELECT invoice_address
from table 
where ship_address IS Null

UNION

SELECT ship_address 
from table 
where ship_address IS NOT NULL
于 2010-12-13T19:29:26.940 に答える