DB2 中的 Cross Apply 等价物

Posted

技术标签:

【中文标题】DB2 中的 Cross Apply 等价物【英文标题】:Cross Apply equivalent in DB2 【发布时间】:2021-07-19 18:15:36 【问题描述】:

我对 SQL 很陌生。我正在尝试加入两个表,如果 JOIN 返回 null,则加入默认值。

学生:

student_id     s_major    name   
------------ ---------- --------
  123           CS        Alice   
  456           CS1       Bob
  789           CS2       Eve
  

专业:

  m_major      description
--------- ---------------------
   CS        Computer Science             
   CS1       Computer Science 1                 

我希望得到这样的结果表:

student_id     s_major  m_major   name     description
------------- -------- --------- ------- -----------------
  123           CS       CS       Alice    Computer Science
  456           CS1      CS1      Bob      Computer Science 1
  789           CS2      CS       Eve      Computer Science    

**所有变量都是char类型

例如,“CS2”,将“2”视为主要选项,但没有此主要选项的说明。所以这个主要选项的默认值将只是主要的,在这种情况下是“CS”。

我发现了一个 post 建议使用 CROSS APPLY。但似乎 DB2 中没有 CROSS APPLY。所以我正在尝试看看是否有任何等效或解决方法。

如果您需要更多信息,请告诉我。提前致谢。

【问题讨论】:

看看 CROSS JOIN。 w3resource.com/sql/joins/cross-join.php @Jeremy 感谢您的评论。我确实检查了 CROSS JOIN。但是 CROSS JOIN 给了我比我需要的更多的行。我不确定在 WHERE 子句中放入什么来过滤结果表 如何准确定义默认值?它们是一些预定义的常量,还是以某种方式从这些表中派生出来的?为什么 id=789 的行有 name=Casey 而不是 Eve(如 Student)? @MarkBarinstein 感谢您的评论。例如,CS2,将 '2' 视为主要选项,但没有此主要选项的说明。所以这个主要选项的默认值将只是主要的,在这种情况下是'CS'。抱歉,id = 789,name = Casey 是个错误。我会解决的。感谢您指出这一点。 【参考方案1】:

试试这个:

WITH 
  STUDENT (student_id, s_major, name) AS
(
VALUES
  (123, 'CS ', 'Alice')  
, (456, 'CS1', 'Bob')
, (789, 'CS2', 'Eve')
)
, MAJOR (m_major, description) AS
(
VALUES
  ('CS ', 'Computer Science')            
, ('CS1', 'Computer Science 1')
)
SELECT S.student_id, S.s_major
, NVL (M.m_major, M2.m_major) AS m_major
, S.name
, NVL (M.description, M2.description) AS description
FROM STUDENT S
LEFT JOIN MAJOR M ON M.M_MAJOR = S.S_MAJOR
CROSS JOIN TABLE
(
SELECT * 
FROM MAJOR M2
WHERE M2.m_major = SUBSTR (S.s_major, 1, 2)
FETCH FIRST 1 ROW ONLY
) M2

dbfiddle 链接。

【讨论】:

感谢您的回答!这对我有帮助。只是一个简短的问题,是否可以检查 m_major = substr(S.s_major,1,2) 是否在 M2 内?我试过但它抱怨NOT VALID IN THE CONTEXT WHERE IT IS USED 您必须使用TABLE 关键字才能指定带有外部表列引用的表达式。我已经编辑了答案。 再次感谢!这正是我正在寻找的。我只是不明白为什么在这里使用FETCH FIRST 1 ROW ONLY。无论有没有这行语句,结果似乎都是一样的。你能详细说明一下吗? 您可能希望在 CROSS JOIN 语句中将别名 M2 更改为 M1 或其他内容。 FETCH FIRST 1 ROW ONLY 是获取给定行的唯一具有默认值的行。此示例不需要它,但在常见情况下可能需要它,当具有这种条件的 S 中的给定行可能从 M2 返回多于 1 行时。所以,这只是为了安全。

以上是关于DB2 中的 Cross Apply 等价物的主要内容,如果未能解决你的问题,请参考以下文章

在 DB2 数据库中转换 CROSS APPLY

softmax_cross_entropy_with_logits 的 PyTorch 等价性

IN 在语句 DB2 等价于 HSQLDB

在 C# 中 if (condition) then apply function that return same type 的功能等价物是啥?

等价于 regexp_substr 中的 regexp_replace((^[A-Z])|([IJ])|(?<= ).)

使用lambda的python map函数的等价物