我试图学习如何将两个文件匹配在一起。但我现在正在尝试每个小时5个小时......但仍然不知道该怎么做。
第一个文件(600.000行)包含4列:
Postal, Number, Houseletter, livingspace
第二个文件(7.000行)包含4列:
Postal, Number, Houseletter, Furniturevalue
在我的第一个文件中,我拥有来自大区域的所有生活空间,在我的第二个文件中,我在这个大区域内有几个地址的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)
我试图用这个查询创建一个带有`postal,number,houseletter,furniturevalue,livingspace'的新视图 所以来自两个表的数据。 但首先我需要用主键解决我的问题。
感谢您的帮助!
ps:我在phpmyadmin中使用sql
答案 0 :(得分: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将会出错。与往常一样,您可能希望在运行此类
之前进行备份第二个问题,您的查询应如下所示:
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)
答案 1 :(得分:0)
ALTER TABLE <TableName>
ADD CONSTRAINT <constraintName> PRIMARY KEY (colA, colB, ..., colN)
答案 2 :(得分: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)
答案 3 :(得分: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;