每个子句上带有参数的并集的SQL视图

时间:2019-06-17 17:19:41

标签: sql postgresql

如何创建一个VIEW,其结果与底部的以下SQL相同。 VIEW必须以任何方式可由任何人使用:

SELECT * FROM my_view WHERE merch_id = 'some_value';

当前的SQL使用PHP代替UNION两侧的WHERE参数,但是语言无关紧要。

这是基本的SQL:

SELECT
    mine.cust_id,
    cust_meta.cust_name,
    mine.bank_id,
    sum(mine.invoices) AS invoices,
    sum(mine.payments) AS payments
FROM (
        SELECT
            cust_id,
            bank_id,
            count(*) AS invoices,
            NULL AS payments
        FROM
            s_bill_meta.t_invoice
        WHERE
            merch_id = '$var'
        GROUP BY
            cust_id,
            bank_id

    UNION

        SELECT
            cust_id,
            bank_id,
            NULL AS invoices,
            count(*) AS payments
        FROM
            s_credit_meta.t_check
        WHERE
            merch_id = '$var'
        GROUP BY
            cust_id,
            bank_id
    ) AS mine
LEFT JOIN
    s_user.t_cust AS cust_meta
        ON mine.cust_id = cust_meta.cust_id
GROUP BY
    mine.cust_id,
    cust_meta.cust_name,
    mine.bank_id
ORDER BY
    mine.cust_id,
    mine.bank_id

2 个答案:

答案 0 :(得分:2)

您将在汇总列中包含merch_id

SELECT mine.cust_id, cust_meta.cust_name, mine.bank_id, mine.merch_id,
       sum(mine.invoices) AS invoices,
       sum(mine.payments) AS payments
FROM ((SELECT cust_id, bank_id, merch_id, count(*) AS invoices, NULL AS payments
       FROMs_bill_meta.t_invoice
       GROUP BY cust_id, bank_id, merch_id 
      ) UNION ALL
      (SELECT cust_id, bank_id, merch_id, NULL AS invoices, count(*) AS payments
       FROM s_credit_meta.t_check
       GROUP BY cust_id, bank_id, merch_id
      )
    ) mine LEFT JOIN
    s_user.t_cust cust_meta
    ON mine.cust_id = cust_meta.cust_id
GROUP BY mine.cust_id, cust_meta.cust_name, mine.bank_id, mine.merch_id
ORDER BY mine.cust_id, mine.bank_id;

答案 1 :(得分:2)

您可以使用功能:

print(f'final j = {j}, i = {i}, n = {n}, s = `{s}`')

然后致电:

CREATE FUNCTION myview(text) RETURNS TABLE
(
cust_id INT,
...
)
 AS '
    SELECT cust_id, ...
    FROM ...
    WHERE  merch_id = $1
    GROUP BY ...
' LANGUAGE SQL;