Sql 仅当第一次联接没有结果时才联接表

Sql 仅当第一次联接没有结果时才联接表,sql,join,db2,Sql,Join,Db2,我有5张表A、B、C、D、E A的主键是B、C、D、E中的外键。它们没有自己的主键 我必须实现某种逻辑,其中 if ("A JOIN B JOIN C" IS NOT NULL) return result of "A JOIN B JOIN C" else if ("A JOIN C" IS NOT NULL) return result of "A JOIN C" else if ("A JOIN D" IS NOT NULL) return result of "A

我有5张表A、B、C、D、E

A的主键是B、C、D、E中的外键。它们没有自己的主键

我必须实现某种逻辑,其中

if ("A JOIN B JOIN C" IS NOT NULL)
    return result of "A JOIN B JOIN C"
else if ("A JOIN C" IS NOT NULL)
    return result of "A JOIN C"
else if ("A JOIN D" IS NOT NULL)
    return result of "A JOIN D"
else if ("A JOIN E" IS NOT NULL)
    return result of "A JOIN E"
else return A

where A.primarykey = <some value>
if(“A连接B连接C”不为空)
返回“A连接B连接C”的结果
else if(“连接C”不为空)
返回“A JOIN C”的结果
else if(“连接D”不为空)
返回“A JOIN D”的结果
else if(“连接E”不为空)
返回“A JOIN E”的结果
否则返回一个
其中A.primarykey=
我必须在单个sql中实现这一点,而不是在存储过程中。 我想不出一个办法来实现这一点。我使用DB2。
如果您能就如何进行提供一些指导,我将不胜感激。

您可以这样做:

select
  case 
     when B.key is not null and C.key is not null then 'A+B+C'
     when C.key is not null then 'A+C'
     when D.key is not null then 'A+D'
     when E.key is not null then 'A+E'
  end
from A
left join B on B.key = A.key
left join C on C.key = A.key
left join D on D.key = A.key
left join E on E.key = A.key
left join F on F.key = A.key
当满足条件时,
case
语句将在一个
后立即停止进一步计算,因此实际上您得到了一个
if else if

在本例中,我只是返回字符串值,但您也可以根据需要返回字段值,例如:

  case 
     when B.key is not null and C.key is not null then b.f1
     when C.key is not null then c.f1
     when D.key is not null then d.f1
     when E.key is not null then e.f1
  end as 'f1'
  ,
  case 
     when B.key is not null and C.key is not null then b.f2
     when C.key is not null then c.f2
     when D.key is not null then d.f2
     when E.key is not null then e.f2
  end as 'f2'

您需要
左连接
s和一些附加逻辑来处理您正在执行的操作的“else”部分:

select . . .
from A left join
     B 
     on B.key = A.key left join
     C
     on C.key = A.key left join
     C c2
     on c2.key = A.key and
        c.key is null left join  -- first attempt failed
     D
     on D.key = A.key and
        c.key is null and
        c2.key is null left join  -- earlier joins failed
     E
     on e.key = A.key and
        c.key is null and
        c2.key is null and
        d.key is null

尝试以下方法。您可以编辑输入数据以检查结果

WITH 
  A (ID, AV) AS (VALUES (1, 'A1'))
, B (ID, BV) AS (VALUES 
(1, 'B1'), (1, 'B2')
--(2, 'B1'), (2, 'B2')
) , C (ID, CV) AS (VALUES 
(1, 'C1'), (1, 'C2'), (1, 'C3')
--(2, 'C1'), (2, 'C2'), (2, 'C3')
), D (ID, DV) AS (VALUES 
(1, 'D1'), (1, 'D2')
--(2, 'D1'), (2, 'D2')
) , E (ID, EV) AS (VALUES 
(1, 'E1'), (1, 'E2'), (1, 'E3')
--(2, 'E1'), (2, 'E2'), (2, 'E3')
)
SELECT A.ID, A.AV, B.BV, C.CV, C1.CV AS CV1, D.DV, E.EV
, 
CASE
  WHEN B.ID  IS NOT NULL THEN 'A+B+C'
  WHEN C1.ID IS NOT NULL THEN 'A+C'
  WHEN D.ID  IS NOT NULL THEN 'A+D'
  WHEN E.ID  IS NOT NULL THEN 'A+E'
  ELSE 'A'
END JOIN_PATH
FROM A
LEFT JOIN 
(
B 
JOIN C ON C.ID=B.ID
)              ON B.ID  = A.ID 
LEFT JOIN C C1 ON C1.ID = A.ID AND B.ID IS NULL
LEFT JOIN D    ON D.ID  = A.ID AND B.ID IS NULL AND C1.ID IS NULL 
LEFT JOIN E    ON E.ID  = A.ID AND B.ID IS NULL AND C1.ID IS NULL AND D.ID IS NULL;

给无效的代码来试图描述一些东西,而不是努力去理解你真正的意思,这是没有多大帮助的。这并不意味着什么,所以只能表达一种模糊不清的猜测。使用足够的单词、句子和引用部分例子,清楚、完整地说出你的意思。当给出一个业务关系(ship)/关联或表(base或query result)时,请说明其中的一行根据其列值表示的业务状况。这样的参数化语句大部分可以机械地转换为SQL。PS阅读EAV通常是如何反模式的。请在代码问题中给出一个--cut&paste&runnable代码;示例输入(作为初始化代码)以及所需和实际输出(包括逐字错误消息);标签和版本;清晰的说明和解释。对于包含最少代码的错误,您可以给出“显示为OK”的代码,并通过“显示为not OK”的代码进行扩展。(调试基础。)对于包含DBMS和DDL的SQL,其中包括约束、索引和表格初始化。如果
A JOIN B
为空,则语句返回空结果集。现在,如果JOIN B为空,而JOIN C为非空,然后你会得到一个JOIN B JOIN C的结果。但是由于JOIN B为空,JOIN B JOIN C为空。@MarkBarinstein。当
B
C
中没有匹配项时,这应该保持
A
中的所有行,因此后续的
联接
应该匹配。您不能在没有附加条件的情况下离开联接表。例如,如果您在
B
中有B行,在
C
中有C行,在
D
中有D行,在
E
中有E行具有相同的键,则此查询返回该键的所有表中所有这些行的笛卡尔乘积,这不太可能是所需的。我理解答案,但不理解向上投票。这忽略了问题中的所有“else”条件,只是将所有表放在一起。