从两个表postgresql函数中选择所有列

时间:2017-07-03 09:17:49

标签: sql postgresql

我有一个简单的SQL连接查询

SELECT a.*,b.*
FROM Orders a
JOIN Customers b ON a.CustomerID=b.CustomerID

选择两个表中的所有列。我需要实现同样的目标 Postgresql函数,但我无法从第二个表中选择数据

CREATE  FUNCTION get_data (p_pattern VARCHAR,p_year INT) 
 RETURNS TABLE (
orders.*,Customers.*
) 
AS $$

2 个答案:

答案 0 :(得分:2)

一个问题是函数和视图都不能返回具有相同名称的列(在两个表中显示的示例列CustomerID中)。而另一个 - 语法:

  

RETURNS TABLE ( column_name column_type [, ...] )

来自official doc

,与table_name.*无关。

除了指定完整列列表的明显解决方案之外,还有一个composite (row, record)类型的技巧:

CREATE  FUNCTION get_data (p_pattern VARCHAR,p_year INT) 
  RETURNS TABLE (order orders, customer customers) 
AS $$

请注意,您可以将表/视图名称用作声明中的类型。

在这种情况下,您的查询可能看起来像

SELECT a, b
FROM Orders a
JOIN Customers b ON a.CustomerID=b.CustomerID

之后,该功能的使用将是:

select
  *, -- two composite columns
  (order).*, -- all columns from table orders
  (customer).*, -- all columns from table customers
  (order).CustomerID -- specific column from specific table  
from
  get_data(<parameters here>);

dbfiddle

答案 1 :(得分:0)

考虑到您要加入的列,您可以这样做:

print (df)
  Variable  Time
0       v1     3
1       v1     4
2       v2     7
3       v2     8
4       v3     3
5       v3     4
6       v3     5

df['Value'] = (~df['Variable'].duplicated()).astype(int)
print (df)
  Variable  Time  Value
0       v1     3      1
1       v1     4      0
2       v2     7      1
3       v2     8      0
4       v3     3      1
5       v3     4      0
6       v3     5      0

有关详情,请参阅官方文档:https://www.postgresql.org/docs/8.2/static/tutorial-join.html

您也可以参考:https://www.tutorialspoint.com/postgresql/postgresql_using_joins.htm 。它有很好的例子和参考postgre中的连接以及如何做它们。