Postgres:如何使用2个不相关的表列形成查询?

时间:2013-08-28 12:32:20

标签: sql database postgresql

我这里有两张桌子:

Table 1
Name   | Longname1  | Longname2
'John' | 'Johnny'   | 'Johnson'
'Kate' | 'Katie'    | 'Kathryn'

我有另一张桌子

Table2
Name     | Area1        | Area2
'John'   | 'Texas'      | 'Alabama'
'Kate'   | 'California' | 'Virginia'

实际上Table1.Longname1和Table2.Area1应该链接在一起,如Table1.Longname2和Table2.Area2。然而,它与postgres无关。

这是我的麻烦

  1. 我怎样才能在表格中添加关系?
  2. 如果我想形成一个

    的查询

    a)输入为'Johnny'(Table1.Longname1),输出为'Texas'(Table2.Area1)

    b)输入为'Johnson'(Table1.Longname2),输出为'Alabama'(Table2.Area2)

    查询本身会为我链接这段关系?有可能吗?

  3. 提前致谢

2 个答案:

答案 0 :(得分:2)

您可以将列转换为如下行:

with cte1 as (
    select "Name", 1 as K, "Longname1" as Longname from Table1
    union all
    select "Name", 2 as K, "Longname2" as Longname from Table1
), cte2 as (
    select "Name", 1 as K, "Area1" as Area from Table2
    union all
    select "Name", 2 as K, "Area2" as Area from Table2
)
select
    c1."Name", c1.K, c1.Longname, c2.Area
from cte1 as c1
    inner join cte2 as c2 on c2."Name" = c1."Name" and c2.K = c1.K

因此它会以某种方式相关

请参阅sql fiddle demo

现在您可以将此查询放入视图中并选择如下:

select *
from vw_Test
where Longname = 'Johnny'

请参阅sql fiddle demo

如果您有这样的关系,您还可以更改数据库模式,以便将数据存储为:

Name   | Longname   | Area
'John' | 'Johnny'   | 'Texas'
'John' | 'Johnson'  | 'Alabama'
'Kate' | 'Katie'    | 'California'
'Kate' | 'Kathryn'  | 'Virginia'

答案 1 :(得分:0)

此查询:

select *
from Table1
inner join Table2 on Table1.Name = Table2.Name 

会给你类似的东西:

Name   | Longname1  | Longname2    | Area1        | Area2
'John' | 'Johnny'   | 'Johnson'    | 'Texas       | 'Alabama'
'Kate' | 'Katie'    | 'Kathryn'    | 'California' | 'Virginia'

您通常可以使用where子句从中选择您想要的内容。

(仅供参考,这是非常正常的设计 - inner join超过表之间的1-1关系。)


对于您的其他问题:

  

我怎样才能在表格中添加关系?

假设Table2补充了Table1,你可以这样做:

ALTER TABLE Table2 ADD FOREIGN KEY (name) REFERENCES Table1 (name);

更好地选择适合您设计的方向(其中一个可选吗?)。

为此,Table1上的name必须是唯一的(最好是主键)。