Oracle 11g sql将一个特定值的表与其他表的所有值连接起来
我试图在两个表上创建一个连接,用于匹配它的值 应返回匹配的记录,但当它具有特定值(例如Oracle 11g sql将一个特定值的表与其他表的所有值连接起来,sql,oracle,Sql,Oracle,我试图在两个表上创建一个连接,用于匹配它的值 应返回匹配的记录,但当它具有特定值(例如All)时 join应针对下面的所有记录返回join示例 Payment ---- Cash Card Wallet Bill_Settlement ----- Cash Card Wallet All 输出 Bill payment ----- ------------ Cash Cash Card Card Wallet Wallet
All
)时
join应针对下面的所有记录返回join示例
Payment
----
Cash
Card
Wallet
Bill_Settlement
-----
Cash
Card
Wallet
All
输出
Bill payment
----- ------------
Cash Cash
Card Card
Wallet Wallet
All Cash
All Card
All Wallet
我不确定我是否正确理解了您的问题,但为了获得所需的输出,您可以使用标准(左外)连接,条件是使用DECODE或CASE函数,如下所示:
WITH
Payment AS (
SELECT 'Cash' AS payment FROM DUAL UNION ALL
SELECT 'Card' AS payment FROM DUAL UNION ALL
SELECT 'Wallet' AS payment FROM DUAL
)
,Bill_Settlement AS (
SELECT 'Cash' AS bill FROM DUAL UNION ALL
SELECT 'Card' AS bill FROM DUAL UNION ALL
SELECT 'Wallet' AS bill FROM DUAL UNION ALL
SELECT 'All' AS bill FROM DUAL
)
-- Main query
SELECT T2.bill
,T1.payment
FROM Bill_Settlement T2
LEFT JOIN Payment T1 -- It should work with INNER JOIN as well
ON T2.bill = DECODE(T2.bill, 'All', T2.bill, T1.payment)
-- Instead of DECODE function you can use standard CASE statement: CASE WHEN (T2.bill = 'All') THEN T2.bill ELSE T1.payment END
;
在本例中,它执行标准筛选,但对于值“All”,它跳过ON语句,并(在本例中)提供cartezian产品
您可能需要使用其他条件扩展ON语句,以避免特定值或更大数据集出现故障
让我知道这是否有效。您可以使用两个查询,第一个是简单的等联接 第二个查询在仅约束特殊值的情况下进行联接,即联接其他表中的所有行 结果与
UNION ALL
相关,因为预期特殊值不在Payment
表中,并且您不需要删除重复项
select *
from Payment p
join Bill_Settlement b
on p.payment = b.bill
union all
select *
from Payment p
join Bill_Settlement b
on b.bill in ('All')
通过应用
OUTER(左或全或右,前提是表的顺序已更改)
和交叉联接
递归地将匹配和不匹配的情况合并在一起,而不固定特定值(All
):
SELECT bill, p2.payment
FROM (SELECT bill, payment
FROM Bill_Settlement
LEFT JOIN Payment
ON bill = payment) p1
CROSS JOIN Payment p2
WHERE p2.payment = p1.payment AND p1.payment IS NOT NULL
OR p1.payment IS NULL
为什么您的输出同时包含这两种情况?你能用一种好的方式来格式化这个问题吗?我认为没有必要固定为一个常量(
All
),以便将匹配的和不匹配的放在一起。