2017-07-03 89 views
0

選擇所有列,我有一個簡單的SQL連接查詢兩個表的PostgreSQL功能

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 $$ 
+0

請詳細說明後。在功能?..你究竟做了什麼,什麼是確切的問題? –

+0

'select *'在我曾經使用過的每個DBMS的查詢中的所有表中進行選擇。 PostGreSQL在這裏有什麼不同嗎?這對我來說似乎很奇怪/不太可能。是的,「我不能X」不是一個有效的問題描述。 –

+0

你的函數應該從所需的表/列中返回一個'select'語句,而不僅僅是表名。另外,大概你真的打算在'where'子句中使用函數參數,否則這個函數不會實現任何有用的功能。 –

回答

1

一個問題是函數和視圖都不能返回具有相同名稱的列(在兩個表中的示例列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

0

考慮到列是目前在其上加入選擇的數據,你可以這樣做:

SELECT * FROM Orders a,Customers b WHERE a.CustomerID=b.CustomerID; 

欲瞭解更多請參考官方文檔:https://www.postgresql.org/docs/8.2/static/tutorial-join.html

您也可以參考這個:https://www.tutorialspoint.com/postgresql/postgresql_using_joins.htm 。它具有良好的範例和參考什麼連接是有在postgre怎麼辦他們。

+0

我需要從上述兩個表中選擇所有列,這將僅返回來自Orders表的列 – Sameer

+0

根據官方文檔,此查詢應該執行這個技巧並返回兩個表的所有列。 –

+0

@underscore_d我沒有提到語法是不鼓勵的。我只是簡要介紹了文檔中所做的事情。 –