我这里有两张桌子:
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无关。
这是我的麻烦
如果我想形成一个
的查询a)输入为'Johnny'(Table1.Longname1),输出为'Texas'(Table2.Area1)
b)输入为'Johnson'(Table1.Longname2),输出为'Alabama'(Table2.Area2)
查询本身会为我链接这段关系?有可能吗?
提前致谢
答案 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
因此它会以某种方式相关
现在您可以将此查询放入视图中并选择如下:
select *
from vw_Test
where Longname = 'Johnny'
如果您有这样的关系,您还可以更改数据库模式,以便将数据存储为:
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
必须是唯一的(最好是主键)。