DB2 中的交叉应用等效项
Cross Apply equivalent in DB2
我对 SQL 很陌生。我正在尝试连接两个 table,如果连接 returns 为空,则连接默认值。
学生:
student_id s_major name
------------ ---------- --------
123 CS Alice
456 CS1 Bob
789 CS2 Eve
专业:
m_major description
--------- ---------------------
CS Computer Science
CS1 Computer Science 1
我希望得到这样的结果 table:
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'。
我发现 建议使用 CROSS APPLY。但似乎 DB2 中没有 CROSS APPLY。所以我想看看是否有任何等效或解决方法。
如果您需要更多信息,请告诉我。提前致谢。
试试这个:
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 link.
我对 SQL 很陌生。我正在尝试连接两个 table,如果连接 returns 为空,则连接默认值。
学生:
student_id s_major name
------------ ---------- --------
123 CS Alice
456 CS1 Bob
789 CS2 Eve
专业:
m_major description
--------- ---------------------
CS Computer Science
CS1 Computer Science 1
我希望得到这样的结果 table:
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'。
我发现
如果您需要更多信息,请告诉我。提前致谢。
试试这个:
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 link.