0

MySQL で次のクエリを実行すると、多くの重複が発生します。明確な記録が必要なだけのことを十分に明確にしていることを知っているので、なぜそれが私にとって2倍になるのか理解できません. importordersほとんどの顧客は顧客と注文で同じ住所を持っているため、最後のユニオン(テーブル)を含めるとすべての重複が表示されるようです。なぜこれが起こるのかを理解するのを手伝ってくれる人はいますか?

SELECT DISTINCT PostalCode, City, Region, Country
FROM 
(select distinct postalcode, city, region, country
from importemployees
UNION
select distinct postalcode, city, region, country
from importcustomers
UNION
select distinct postalcode, city, region, country
from importproducts
UNION
select distinct shippostalcode as postalcode, shipcity as city, shipregion as region, shipcountry as country
from importorders) T

クエリと結果

ご覧のように。一部の行が重複しています。

最初INSERT IGNOREに挿入してからを使用すると、レコードを重複として識別できます。選択クエリが機能しないのはなぜですか?importcustomersimportorders

4

1 に答える 1

2

非常に興味深い問題。「国」を削除すると、問題が解決するようです。

SELECT DISTINCT PostalCode, City, Region

合計 128 件、クエリにかかった時間は 0.0066 秒

SELECT DISTINCT PostalCode, City, Region, Country

合計 209 件、クエリにかかった時間は 0.0002 秒

さらに、動作は以下にのみ影響しているようImportCustomersですImportOrders:

SELECT postalcode, city, region, country
FROM 
    (SELECT postalcode, city, region, country FROM importcustomers
    UNION
    SELECT shippostalcode, shipcity, shipregion, shipcountry FROM importorders) t

合計 172 件、クエリにかかった時間は 0.0053 秒

SELECT postalcode
FROM 
    (SELECT postalcode FROM importcustomers
    UNION
    SELECT shippostalcode FROM importorders) t

合計 91 件、クエリにかかった時間は 0.0050 秒

country次に、上の列にimportcusotmers絞り込みましたimportorders

SELECT TRIM(country) AS country FROM importcustomers
UNION
SELECT TRIM(shipcountry) AS country FROM importorders
アルゼンチン
アルゼンチン
オーストリア
オーストリア
ベルギー
ベルギー
...

列をキャストすると、興味深いことが起こりましたBINARY

SELECT BINARY country AS country FROM importcustomers
UNION
SELECT BINARY shipcountry AS country FROM importorders
アルゼンチン
417267656e74696e610d
オーストリア
417573747269610d
ベルギー
42656c6769756d0d
...

テーブルImportOrdersが重複の原因です。

 SELECT BINARY shipcountry AS country FROM importorders
4765726d616e790d
5553410d
5553410d
4765726d616e790d
...

あなたが提供したダンプを見ると、国の終わりに余分な\r(値で表される) が追加されています。0d

--
-- テーブル `importorders` のデータをダンプしています
--
INSERT INTO `importorders` 値
...'ドイツ\r')、
...'USA\r'),
...'USA\r'),
...'ドイツ\r')、
...'メキシコ\r'),

見栄えの良いimportcustomers場所:country

--
-- テーブル `importcustomers` のデータをダンプしています
--
INSERT INTO `importcustomers` 値
...「ドイツ」、...、
...「メキシコ」、...、
...「メキシコ」、...、
...'イギリス'、 ... 、
...「スウェーデン」、...、

\r次のクエリを実行すると、これらの (キャリッジ リターン)を削除できます。

UPDATE importorders SET ShipCountry = REPLACE(ShipCountry, '\r', '')

元のクエリを実行すると、目的の結果セットが得られます。DISTINCT参考までに、を使用している場合は必要ありませんUNION

SELECT PostalCode, City, Region, Country
FROM 
    (SELECT postalcode, city, region, country FROM importemployees
    UNION
    SELECT postalcode, city, region, country FROM importcustomers
    UNION
    SELECT postalcode, city, region, country FROM importproducts
    UNION
    SELECT shippostalcode as postalcode, shipcity as city, 
        shipregion as region, shipcountry as country FROM importorders) T
于 2012-09-12T18:40:55.523 に答える