4

2 つのファイルを一致させる方法を学習しようとしています。しかし、私は今5時間すべてを試しています...それでも何をすべきかわかりません.

最初のファイル (600.000 行) には 4 つの列が含まれています。

Postal, Number, Houseletter, livingspace

2 番目のファイル (7.000 行) には 4 つの列が含まれています。

Postal, Number, Houseletter, Furniturevalue

最初のファイルには、大きなエリアのすべての生活空間があり、2 番目のファイルには、その大きなエリアのいくつかの住所の家具値があります。

2 番目のファイルの住所に、ファイル 1 の居住空間を追加したいと考えています。

そのため、ファイルをデータベースにインポートしました。

Table first file -> Space
Table second file -> Furniture

今、私はテーブルに主キーを作成しようとしています:

Primary key --> Postal, Number, Houseletter

しかし、列は Postal+Number+Houseletter の場合にのみ一意であり、互いに離れていないため、これは機能しません。

次のステップを知っている人はいますか?このクエリを機能させるには、次のことを行う必要があります。

SELECT postal, number, houseletter, furniturevalue, livingspace
FROM space, furniture
WHERE ( space.postal = furniture.postal
AND     space.number = furniture.number
AND     space.houseletter = furniture.houseletter)

このクエリを使用して、「postal、number、houseletter、furniturevalue、livingspace」という新しいビューを作成しようとしています。つまり、2 つのテーブルからのデータです。しかし、まず、主キーに関する問題の解決策が必要です。

ご協力いただきありがとうございます!

ps: phpmyadmin で sql を使用しています

4

4 に答える 4

8
ALTER TABLE space ADD PRIMARY KEY(Postal, Number, Houseletter);

主キーがすでに存在する場合は、次のようにします。

ALTER TABLE space DROP PRIMARY KEY, ADD PRIMARY KEY(Postal, Number, Houseletter);

PK が重複している場合は、これを試すことができます。

ALTER IGNORE TABLE space ADD UNIQUE INDEX idx_name (Postal, Number, Houseletter );

これにより、すべての重複行が削除されます。追加の利点として、重複する将来の INSERT はエラーになります。いつものように、このようなものを実行する前にバックアップを取ることをお勧めします

2 番目の質問です。クエリは次のようになります。

SELECT postal, number, houseletter, furniturevalue, livingspace
FROM space INNER JOIN furniture
ON ( space.postal = furniture.postal
AND     space.number = furniture.number
AND     space.houseletter = furniture.houseletter)
于 2013-03-29T16:04:03.167 に答える
0

組み合わせgroup byごとに一意の行を作成するために使用できます。(postal, number, houseletter)集計はlivingspace、そのグループの値を計算します。livingspaceこの例では、max()集計で最高のものを選択します。

select  coalesce(space.postal, furniture.postal) as postal
,       coalesce(space.number, furniture.number) as number
,       coalesce(space.houseletter, furniture.houseletter) as houseletter
,       max(furniture.furniturevalue) as furniturevalue
,       max(space.livingspace) as livingspace
from    space
full outer join
        furniture
on      space.postal = furniture.postal
        and space.number = furniture.number
        and space.houseletter = furniture.houseletter
group by
        coalesce(space.postal, furniture.postal)
,       coalesce(space.number, furniture.number)
,       coalesce(space.houseletter, furniture.houseletter)
于 2013-03-29T16:05:08.847 に答える
0

このようなものがうまくいくかもしれません。concat() を使用して列を結合できます。

select (concat(s.Postal,' ',s.Number,' ',s.Houseletter)) as s.address,(concat(f.Postal,' ',f.Number,' ',f.Houseletter)) as f.address,s.*,f.* from space s,furniture f where s.address=f.address;
于 2013-03-29T16:12:23.370 に答える
0
ALTER TABLE <TableName>
ADD CONSTRAINT <constraintName> PRIMARY KEY (colA, colB, ..., colN)
于 2013-03-29T16:03:54.523 に答える