4

我试图学习如何将两个文件匹配在一起。但我现在正在尝试一切 5 小时......仍然不知道该怎么做。

第一个文件(600.000 行)包含 4 列:

Postal, Number, Houseletter, livingspace

第二个文件(7.000 行)包含 4 列:

Postal, Number, Houseletter, Furniturevalue

在我的第一个文件中,我有一个大区域的所有生活空间,在我的第二个文件中,我有那个大区域中几个地址的家具价值。

我想将文件 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)

我试图用这个查询创建一个新视图,其中包含“邮政、号码、houseletter、家具价值、生活空间”所以来自两个表的数据。但首先我需要解决我的主键问题。

谢谢你的帮助!

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 );

这将删除所有重复的行。作为一个额外的好处,未来的重复插入将出错。与往常一样,您可能需要在运行类似这样的操作之前进行备份

第二个问题,您的查询应如下所示:

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
ALTER TABLE <TableName>
ADD CONSTRAINT <constraintName> PRIMARY KEY (colA, colB, ..., colN)
于 2013-03-29T16:03:54.523 回答
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

Something like this might work. You can use concat() to combine the columns together.

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 回答