2016-06-12 69 views
0

我试图建立一个请求来从表中获取数据,但其中一些列有外键,我想用一个请求中的关联关键字替换这些外键。Postgresql从字典中获取参考

基本上有一个与第1列

表A中:PKA-ID和列2:名称。 表B第1列:PKB-ID,第2列:FKA-ID第3列:金额。

我想在表B,而由相关联的名称表A代替

我开始建设有一个子请求+别名来获得一个请求的所有外键的所有行,但OFC我有每个子请求的结果不止一个,但我找不到将子请求与主表请求中的表B的ID关联的方式[可能已被用尽,无论是双重还是两者]。我做了这样的事情:

SELECT (SELECT "NAME" FROM A JOIN B ON ID = FKA-ID) AS name, amount FROM TABLEB; 

感觉这么简单但又请求......

回答

0

你不需要在子选择一个连接。

SELECT pkb_id, 
    (SELECT name FROM a WHERE a.pka_id = b.fka_id), 
    amount 
FROM b; 

(看到它住在SQL Fiddle)。

子选择查询为其父选择的每一行运行,并且具有可从上下文获得的父行。


您还可以使用简单的连接。

SELECT b.pkb_id, a.name, b.amount 
FROM b, a 
WHERE a.pka_id = b.fka_id; 

注意,加入版本穿PostgreSQL的查询优化器限制少所以在某些情况下,加入的版本可能会工作得更快。 (例如,在PostgreSQL 9.6中,连接可能使用多个CPU单元,参见Parallel Query)。

+0

谢谢,这有帮助,我目前正在寻找自己,但我会在同时问:实际上有两个引用到A表中,有两个FKA,它们在理论上可能是相同的,但大多数时候他们不是,它会如何适用? – aurawastaken

+0

尝试类似但没有的东西:SELECT b。“ID”,a。“fka”as n1,b。“VALUE1”,a。“fka”as n2,b。“VALUE2”,b。“VALUE3”,b 。“VALID”FROM public。“BTABLE”as b,public。“ATABLE”as WHERE n1 = a。“ID”AND n2 = a。“ID” – aurawastaken

+0

好吧,你帮助我重新创建我的问题并解决它SQL小提琴:http://sqlfiddle.com/#!9/94ba69/8,但我不知道它是如何工作的,因为我从来没有在子请求中引用TABLEB,我认为这让我感到困惑,不管怎样,谢谢! [选择'PK-ID-B',(从TABLEA选择'名称',其中'FKA-ID1'='PK-ID-A'),'VALUE1',(从'TABLEA选择'名称'FKA- ID2' ='PK-ID-A'),'VALUE2' FROM TABLEB;] – aurawastaken