1

我这里有两张桌子:

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)

    哪个查询本身会为我链接关系?可能吗?

提前致谢

4

2 回答 2

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'
于 2013-08-28T12:41:11.743 回答
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);

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

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

于 2013-08-28T12:38:45.070 回答