使用不相交的行连接公共属性上的多个表

问题描述 投票:0回答:1

我有多个表,需要连接多个公共属性,这样不同的属性可以显示在一个表中。

表格1

+--------+---------+-------+--------+
|  make  |  model  | year  |  kms   |
+--------+---------+-------+--------+
| toyota | corolla |  1999 |  25000 |
| toyota |  camry  |  2002 |  50000 |
+--------+---------+-------+--------+

表2

+--------+---------+-------+---------+
|  make  |  model  | year  | mileage |
+--------+---------+-------+---------+
| toyota | corolla |  1999 |      20 |
| toyota |  qualis |  2004 |      25 |
+--------+---------+-------+---------+

表3

+--------+----------+-------+-------+
|  make  |  model   | year  | color |
+--------+----------+-------+-------+
| toyota |  camry   |  2002 | blue  |
| toyota |  rav4    |  2006 | green |
+--------+----------+-------+-------+

我正在做以下事情来加入结果

select 
    * from table1 as a
    full join table2 as b
    using (make, model, year)
    full join table3 as c
    using (make, model, year)

我需要的是如下表格。

+--------+---------+-------+-------+----------+--------+
|  make  |  model  | year  |  kms  |  mileage |  color |
+--------+---------+-------+-------+----------+--------+
| toyota | corolla |  1999 | 25000 |       20 |        |
| toyota |  camry  |  2002 | 50000 |          |  blue  |
| toyota |  qualis |  2004 |       |       25 |        |
| toyota |  rav4   |  2006 |       |          | green  |
+--------+---------+-------+-------+----------+--------+

但是我得到的结果是make,model,year与某些行的空值重复。

我如何获得所需要的。请注意,对于我正在使用的真实数据集,每个表有5个common attributes,每个表有大约20-40个different attributes

sql postgresql
1个回答
2
投票

重复可能是由于您正在使用的完整联接。将这些更改为左连接,如下所示:

SELECT
A.MAKE, A.MODEL, A.YEAR, T1.KMS, T2.MILEAGE, T3.COLOR
FROM
(SELECT MAKE, MODEL, YEAR FROM TABLE1 UNION 
SELECT MAKE, MODEL, YEAR FROM TABLE2 UNION
SELECT MAKE, MODEL, YEAR FROM TABLE3) A
LEFT JOIN TABLE1 T1 
ON T1.MAKE = A.MAKE AND T1.MODEL = A.MODEL AND T1.YEAR = A.YEAR
LEFT JOIN TABLE2 T2
ON T2.MAKE = A.MAKE AND T2.MODEL = A.MODEL AND T2.YEAR = A.YEAR
LEFT JOIN TABLE3 T3
ON T3.MAKE = A.MAKE AND T3.MODEL = A.MODEL AND T3.YEAR = A.YEAR;;
© www.soinside.com 2019 - 2024. All rights reserved.