如何在DB2 sql中为连接条件给予优先级?

7gyucuyw  于 2022-11-07  发布在  DB2
关注(0)|答案(2)|浏览(181)

我 在 表 A 和 表 B 之间 有 一 个 左 连接 , 它 满足 下面 给定 条件 。
" 左 " 表 A :
| 姓名|城市|乡村|
| - -| - -| - -|
| 鲍勃|不 适用|不 适用|
| 汤姆|纽约 州|美国|
" 右 " 表 B
| 姓名|旗帜|地点|
| - -| - -| - -|
| 鲍勃|不 适用|不 适用|
| 汤姆|所在 城市|纽约 州|
| 汤姆|国家/地区|美国|
当前 结果 :
| 姓名|旗帜|地点|
| - -| - -| - -|
| 鲍勃|不 适用|不 适用|
| 汤姆|所在 城市|纽约 州|
| 汤姆|国家/地区|美国|
预期 结果 :
| 姓名|旗帜|地点|
| - -| - -| - -|
| 鲍勃|不 适用|不 适用|
| 汤姆|所在 城市|纽约 州|
x1月 1 日
OR (B.FLAG=CITY AND B.SITE=A.CITY AND A.NAME= B.NAME)
OR (B.FLAG=COUNTRY AND B SITE=A.COUNTRY AND A.NAME=B.NAME)
如果 不是 第 1 种 , 则 为 第 2 种 , 否则 为 第 3 种 条件
我 想 优先 考虑 这 三 个 条件 , 即 当 满足 第 一 个 条件 时 , 不 应 考虑 其余 两 个 条件 。
如果 满足 第 二 个 连接 条件 , 则 即使 可能 , 也 不 应 按照 第 二 个 条件 再次 连接 。
只 应 使用 三 个 联接 条件 中 的 一 个 。
我 得到 了 双 行 , 因为 一些 行 同时 满足 第 二 个 和 第 三 个 条件 , 这 是 不 正确 的 , 根据 我 的 要求 。
我 应该 在 这里 添加 什么 ? 我 如何 才能 获得 所 需 的 优先 级 ?

uqxowvwt

uqxowvwt1#

试试看:

WITH 
  A (name, city, country) AS
  (
    VALUES
      ('BOB',   'NA',       'NA')
    , ('TOM',   'NEW YORK', 'USA')
  )
, B (name, flag, site) AS
  (
    VALUES
      ('BOB',   'NA',       'NA')
    , ('TOM',   'CITY',     'NEW YORK')
    , ('TOM',   'COUNTRY',  'USA')
  )
SELECT 
  A.NAME
, COALESCE (B1.FLAG, B2.FLAG, B3.FLAG)  AS FLAG  
, COALESCE (B1.SITE, B2.SITE, B3.SITE)  AS SITE  
FROM A
LEFT JOIN B B1 ON (B1.FLAG, B1.SITE, B1.NAME) = ('NA',      'NA',       A.NAME)
LEFT JOIN B B2 ON (B2.FLAG, B2.SITE, B2.NAME) = ('CITY',    A.CITY,     A.NAME) AND B1.NAME IS NULL
LEFT JOIN B B3 ON (B3.FLAG, B3.SITE, B3.NAME) = ('COUNTRY', A.COUNTRY,  A.NAME) AND B1.NAME IS NULL AND B2.NAME IS NULL

| 名称|旗标|站点|
| - -|- -|- -|
| 鲍勃|不适用|不适用|
| 汤姆|所在城市|纽约|

iqih9akk

iqih9akk2#

使用括号来分隔不同的条件。否则,您可能会得到错误的结果。请尝试此操作。

( B.FLAG=NA AND B.SITE = NA AND A.NAME=B.NAME )
OR
(  B.FLAG=CITY AND B.SITE=A.CITY AND A.NAME= B.NAME )
OR 
( B.FLAG=COUNTRY AND B SITE=A.COUNTRY AND A.NAME=B.NAME )

相关问题