Sql 连接或匹配两个表中的值

Sql 连接或匹配两个表中的值,sql,oracle,Sql,Oracle,我有两张桌子。根据第一个表,我需要检查它是否被锁定 在下面的示例中,如果存在组合,那么我将选择它应该与“All”匹配的其他组合,并带来该记录 锁定表 交易表 输出 查询已尝试-但正在进行交叉连接。我明白原因,但无法解决它 SELECT a.GROUP,a.OFFICE,b.LOCK FROM T_ITEMS a INNER JOIN LOCKED_T b ON a.ORG=c.ORG AND (a.OFFICE =b.OFFICE OR b.OFFICE='All') AND a.GROU

我有两张桌子。根据第一个表,我需要检查它是否被锁定

在下面的示例中,如果存在组合,那么我将选择它应该与“All”匹配的其他组合,并带来该记录

锁定表

交易表

输出

查询已尝试-但正在进行交叉连接。我明白原因,但无法解决它

SELECT a.GROUP,a.OFFICE,b.LOCK
FROM T_ITEMS a INNER JOIN LOCKED_T b
ON a.ORG=c.ORG
AND (a.OFFICE =b.OFFICE OR b.OFFICE='All')
AND a.GROUP=b.GROUP

您要做的是在组上进行匹配,或者将all用作“通配符”。问题是,对于其中一个项目,您在这两个方面都进行了匹配——因此得到了两个结果

所以你要做的是第一次加入

SELECT a.GROUP, a.OFFICE, b.LOCK
FROM T_ITEMS a 
LEFT JOIN LOCKED_T b ON a.ORG = c.ORG A 
                     AND a.OFFICE = b.OFFICE 
                     AND a.GROUP = b.GROUP
现在,获取这些结果,并尝试填充缺少的结果(缺少的结果在lock列中将有一个null)

SELECT 
    BASE.GROUP, BASE.OFFICE, COLLESCE(BASE.LOCK, L.LOCK) AS LOCK
FROM
    (SELECT 
         a.GROUP, a.OFFICE, b.LOCK
     FROM 
         T_ITEMS a 
     LEFT JOIN 
         LOCKED_T b ON a.ORG = c.ORG  
                    AND a.OFFICE = b.OFFICE 
                    AND a.GROUP = b.GROUP) BASE
LEFT JOIN 
    LOCKED_T L ON BASE.ORG = L.ORG 
               AND L.OFFICE = 'All' 
               AND base.GROUP = L.GROUP 
               AND BASE.LOCK IS NULL

您要做的是在组上进行匹配,或者将all用作“通配符”。问题是,您在其中一个项上同时在这两个项上进行匹配,因此会得到两个结果

所以你要做的是第一次加入

SELECT a.GROUP, a.OFFICE, b.LOCK
FROM T_ITEMS a 
LEFT JOIN LOCKED_T b ON a.ORG = c.ORG A 
                     AND a.OFFICE = b.OFFICE 
                     AND a.GROUP = b.GROUP
现在,获取这些结果,并尝试填充缺少的结果(缺少的结果在lock列中将有一个null)

SELECT 
    BASE.GROUP, BASE.OFFICE, COLLESCE(BASE.LOCK, L.LOCK) AS LOCK
FROM
    (SELECT 
         a.GROUP, a.OFFICE, b.LOCK
     FROM 
         T_ITEMS a 
     LEFT JOIN 
         LOCKED_T b ON a.ORG = c.ORG  
                    AND a.OFFICE = b.OFFICE 
                    AND a.GROUP = b.GROUP) BASE
LEFT JOIN 
    LOCKED_T L ON BASE.ORG = L.ORG 
               AND L.OFFICE = 'All' 
               AND base.GROUP = L.GROUP 
               AND BASE.LOCK IS NULL
我认为这是一个“默认”问题。这可以通过两个
左连接解决:

SELECT i.GROUP, i.OFFICE,
       COALESCE(l.LOCK, l_default.LOCK)
FROM T_ITEMS i LEFT JOIN
     LOCKED_T l
     ON l.ORG = i.ORG AND l.OFFICE = i.OFFICE LEFT JOIN
     LOCKED_T l_default
     ON l_default.OFFICE = 'All' AND l_default.GROUP = i.GROUP AND l.ORG IS NULL;
随着组合数量的增加,这变得越来越棘手。因此,一种更具普遍性的替代方法使用相关子查询:

SELECT i.*,
       (SELECT MAX(l.LOCK) KEEP (DENSE_RANK FIRST ORDER BY NULLIF(l.OFFICE, 'All) NULLS LAST,NULLIF(l.GROUP, 'All) NULLS LAST
        FROM LOCKED_T l
        WHERE (l.OFFICE = i.OFFICE OR l.OFFICE = 'All') AND
              (l.GROUP = i.GROUP OR l.GROUP = 'All')
       ) as LOCKED

FROM T_ITEMS i;
Oracle 12C支持横向联接,因此这实际上可以放在
FROM
子句中。

我认为这是一个“默认”问题。这可以通过两个
左联接来解决:

SELECT i.GROUP, i.OFFICE,
       COALESCE(l.LOCK, l_default.LOCK)
FROM T_ITEMS i LEFT JOIN
     LOCKED_T l
     ON l.ORG = i.ORG AND l.OFFICE = i.OFFICE LEFT JOIN
     LOCKED_T l_default
     ON l_default.OFFICE = 'All' AND l_default.GROUP = i.GROUP AND l.ORG IS NULL;
随着组合数量的增加,这变得越来越棘手。因此,一种更具普遍性的替代方法使用相关子查询:

SELECT i.*,
       (SELECT MAX(l.LOCK) KEEP (DENSE_RANK FIRST ORDER BY NULLIF(l.OFFICE, 'All) NULLS LAST,NULLIF(l.GROUP, 'All) NULLS LAST
        FROM LOCKED_T l
        WHERE (l.OFFICE = i.OFFICE OR l.OFFICE = 'All') AND
              (l.GROUP = i.GROUP OR l.GROUP = 'All')
       ) as LOCKED

FROM T_ITEMS i;

Oracle 12C支持横向联接,因此这实际上可以放在
FROM
子句中。

除了将两个联接放在同一查询中之外,这不是与我的答案相同吗?除了将两个联接放在同一查询中之外,这不是与我的答案相同吗?