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
),以便将匹配的和不匹配的放在一起。