当前位置: 首页 > 知识库问答 >
问题:

具有外部左联接的SQL子查询

慕容昊焜
2023-03-14

我需要从表A中选择所有行,如果表B行与表B选择位置子句匹配,则从表B中选择匹配的行。这是我的外部左连接与子查询,但它失败了。有人可以帮忙吗?

SELECT A.WRDWHSE,
       A.WRDRTID,
       A.WRDRPTLIN
FROM CWDDEV.WRTEMSTDP AS A 
LEFT JOIN (SELECT B.RHRTID,
                  B.RHRTE, 
                  B.RHSTAT, 
                  B.RHPRTT 
           FROM PIRF3.RTEHED
           WHERE B.RHWHSE=003 and 
                 ((B.RHSTSD =20151111 and B.RHSTST >=060000 ) or (B.RHSTSD=20151112 and B.RHSTST <=055959 )) and
                 B.RHTYPE NOT IN ('W') and 
                 (B.RHRTE NOT LIKE 'EMP%') and
                 B.RHSTAT IN (1, 3, 4, 5, 6)) AS B                                                     
ON A.WRDWHSE=B.RHWHSE and A.WRDRTID=B.RHRTE
WHERE A.WRDWHSE=003     
ORDER BY A.WRDRPTLIN               

共有1个答案

黄元章
2023-03-14

以下是我最初的想法,与你的问题一致:

SELECT *
FROM
    CWDDEV.WRTEMSTDP A LEFT OUTER JOIN
    (
    SELECT
        B.RHWHSE, B.RHRTE,
        B.RHRTID, B.RHSTAT, B.RHPRTT /* are these going to be used? */
    FROM PIRF3.RTEHED B
    WHERE
            B.RHWHSE = 003 /* why all the leading zeros? are these numeric or a char? */
        AND (
               /* if these are really dates then these won't work */
               (B.RHSTSD = 20151111 AND B.RHSTST >= 060000)
            OR (B.RHSTSD = 20151112 AND B.RHSTST <= 055959)
        )
        AND B.RHTYPE NOT IN ('W')
        AND B.RHRTE NOT LIKE 'EMP%'
        AND B.RHSTAT IN (1, 3, 4, 5, 6)
    ) B_outer /* inside and outside have different names */
        ON A.WRDWHSE = B_outer.RHWHSE AND A.WRDRTID = B_outer.RHRTE
WHERE A.WRDWHSE = 003
ORDER BY A.WRDRPTLIN      

编辑:根据下面的对话,我愿意考虑一个DB2 / AS400错误。使用左联接的方案非常常见。但以下是查询的一些变体,这些变体可能会起作用或有助于找出一些东西。

消除冗余条件:

SELECT *
FROM
    CWDDEV.WRTEMSTDP A LEFT OUTER JOIN
    (
    SELECT B.RHWHSE, B.RHRTE, B.RHRTID, B.RHSTAT, B.RHPRTT
    FROM PIRF3.RTEHED B
    WHERE
        (
               B.RHSTSD = 20151111 AND B.RHSTST >= 060000
            OR B.RHSTSD = 20151112 AND B.RHSTST <= 055959
        )
        AND B.RHTYPE <> 'W'
        AND B.RHRTE NOT LIKE 'EMP%'
        AND B.RHSTAT IN (1, 3, 4, 5, 6)
    ) B_outer
        ON A.WRDWHSE = B_outer.RHWHSE AND A.WRDRTID = B_outer.RHRTE
WHERE A.WRDWHSE = 3 AND A.WRDRTID = 73
ORDER BY A.WRDRPTLIN

公用表表达式 (CTE):

WITH ROUTES AS ( /* this might not be valid if your platform is old */
    SELECT
        B.RHWHSE, B.RHRTE, B.RHRTID, B.RHSTAT, B.RHPRTT
    FROM PIRF3.RTEHED B
    WHERE
        (
               B.RHSTSD = 20151111 AND B.RHSTST >= 060000
            OR B.RHSTSD = 20151112 AND B.RHSTST <= 055959
        )
        AND B.RHTYPE <> 'W'
        AND B.RHRTE NOT LIKE 'EMP%'
        AND B.RHSTAT IN (1, 3, 4, 5, 6)
)
SELECT *
FROM CWDDEV.WRTEMSTDP A LEFT OUTER JOIN ROUTES B
    ON A.WRDWHSE = B.RHWHSE AND A.WRDRTID = B.RHRTE
WHERE A.WRDWHSE = 3 AND A.WRDRTID = 73
ORDER BY A.WRDRPTLIN

联盟:

SELECT
    A.WRDWHSE, A.WRDRTID, A.WRDRPTLIN,
    B.RHRTE, B.RHSTAT, B.RHPRTT
FROM
    CWDDEV.WRTEMSTDP A INNER JOIN PIRF3.RTEHED B
        ON A.WRDWHSE = B_outer.RHWHSE AND A.WRDRTID = B_outer.RHRTE
WHERE
        A.WRDWHSE = 3 AND A.WRDRTID = 73
    (
           B.RHSTSD = 20151111 AND B.RHSTST >= 060000
        OR B.RHSTSD = 20151112 AND B.RHSTST <= 055959
    )
    AND B.RHTYPE <> 'W'
    AND B.RHRTE NOT LIKE 'EMP%'
    AND B.RHSTAT IN (1, 3, 4, 5, 6)
UNION ALL
SELECT
    A.WRDWHSE, A.WRDRTID, A.WRDRPTLIN,
    NULL AS RHRTE, NULL AS RHSTAT, NULL AS RHPRTT
FROM CWDDEV.WRTEMSTDP A
WHERE A.WRDWHSE = 3 AND A.WRDRTID = 73 AND NOT EXISTS (
    SELECT 1
    FROM PIRF3.RTEHED B
    WHERE
            A.WRDWHSE = B.RHWHSE AND A.WRDRTID = B.RHRTE
        AND (
               B.RHSTSD = 20151111 AND B.RHSTST >= 060000
            OR B.RHSTSD = 20151112 AND B.RHSTST <= 055959
        )
        AND B.RHTYPE <> 'W'
        AND B.RHRTE NOT LIKE 'EMP%'
        AND B.RHSTAT IN (1, 3, 4, 5, 6)
    )
ORDER BY A.WRDRPTLIN

如果您真的需要使其工作,您也可以尝试视图或临时表。听起来您提到的嵌套循环可能是您最好的解决方法。

 类似资料:
  • 那么如何将此更改为jpql查询代码呢?谢谢

  • 问题内容: 我有这些表, 和。我想执行左外部联接。 劳斯莱斯 推出 SUMing,JOINing和GROUPings之后的预期输出==> 我的代码: 但是上面代码的O / P是 我不知道我要去哪里错了-你能解释一下吗? 问题答案: 您没有做错任何事。这就是JOIN的行为 它是左边的行数X右边的行数,在您的情况下为3 x 2 = 6。 试试这个 SQLFiddle 我知道这不适用于SQL Serve

  • 问题内容: 我有一个网站,用户可以在其中查看电影列表,并为其创建评论。 用户应该能够看到所有电影的列表。此外,如果他们查看了电影,则他们应该能够看到他们给它的评分。如果不是,则仅显示没有得分的电影。 他们根本不在乎其他用户提供的分数。 考虑以下 我本质上想要的是 考虑以下内容: 两个测试都应打印完全相同的输出,但是,只有原始版本会吐出正确的结果表: orm会返回这个 任何试图加入其余主题的尝试,那

  • 问题内容: 我有两个包含“任务”和“注释”的表,并且想要检索一个任务列表,以及每个任务的关联注释数。这两个查询可以完成任务: 它们之间有区别吗?我应该在一个之上使用另一个,还是它们只是完成同一工作的两种方式?谢谢。 问题答案: 在小型数据集上,当涉及到性能时,它们会被淘汰。索引时,LOJ会好一些。 我发现在大型数据集上,内部联接(内部联接也将起作用。)将在很大的因素(抱歉,没有数字)方面优于子查询

  • 我将两个表上的连接定义为左外部连接,以便所有记录都从左表返回,即使它们在右表中没有记录。不过,我还需要包含一个where子句,但是...即使不满足where子句中的条件,我仍然希望为左侧表中的每个记录返回左侧表中的一行。有办法做到这一点吗? 我正在编写带有联接条件的查询,如下所示 以上条件不返回任何行。其中如下条件返回... 输出应为

  • 问题内容: 我在基于放置过滤条件的位置的查询中基于过滤条件得到不同的结果。我的问题是: 这些查询之间在技术上有区别吗? SQL标准中是否有任何内容可以解释与查询不同的记录集? 在简化的情况下: 我以为查询将返回相同的结果集,而当它们没有返回时,我感到很惊讶。我使用的是MS SQL2005,在实际查询中,查询1返回了约700行,查询2返回了约1100行,但我无法检测到返回行和排除行的模式。查询1中仍