【问题标题】:sql: left join when two fields (the same field) from the same table existsql:当同一张表中的两个字段(同一个字段)存在时左连接
【发布时间】:2021-08-30 05:29:11
【问题描述】:
SELECT ****,
    ****,
    ****,
    ****,
    ****
FROM ****.**** ord
    LEFT JOIN ****.progress p1 ON p1.id = ord.id
    LEFT JOIN ****.progress p2 ON p2.id = ord.id
  left join ****.status os on p1.status_number = os.status_number
WHERE ord.status_number = 10
    AND p1.status_number = 10
    AND p2.status_number = 9

(出于安全/隐私原因,我已使用星号)。 我在第三次左加入时需要帮助。使用状态表中的 status_number 时,如何对两个字段(p1.id 和 p2.id 都来自进度表)进行左连接。我需要同时包含 p1 和 p2 但不工作,感谢任何帮助谢谢

【问题讨论】:

  • 跳过****掩码,组成一些列名,如c1、c2、c3等
  • 轻松为您提供帮助:minimal reproducible example.
  • @jarlh 我想到了,但 **** 更容易
  • 您确定要外连接吗?看起来您只需要内部连接,但两个进度的状态:INNER JOIN progress p1 ON p1.id = ord.id AND p1.status_number = 10 INNER JOIN status s1 ON s1.status_number = p1.status_number ...
  • @ThorstenKettner atm 我遇到了条件问题,将 1 个表连接到同一个表的 2 个字段,但会在排序后查看要使用的连接。但是你改变加入不会解决我的主要问题,

标签: sql oracle oracle11g oracle10g oracle-sqldeveloper


【解决方案1】:

我已经解决了我的问题,在左连接中我使用了错误的字段,我必须将另一个字段放在 ON 子句中,这些 p1 和 p2 id 仅在 where 子句中。感谢大家的回复。

我不能发布太多信息,因为它是我的作品数据库。如果我输入我的作品数据库的内部运作,我会被解雇。

【讨论】:

    【解决方案2】:

    如果您想要left joins,那么您的查询应该具有除on 子句中的第一个表之外的所有表的条件。这看起来像:

    SELECT . . .
    FROM ****.**** ord LEFT JOIN
         ****.progress p1
         ON p1.id = ord.id AND p1.status_number = 10 LEFT JOIN
         ****.progress p2
         ON p2.id = ord.id AND p2.status_number = 9 LEFT JOIN
         ****.status os 
         ON p1.status_number = os.status_number
    WHERE ord.status_number = 10;
    

    如果您想要每个status_nmber 的状态两次

    FROM ****.**** ord LEFT JOIN
         ****.progress p1
         ON p1.id = ord.id AND p1.status_number = 10 LEFT JOIN
         ****.progress p2
         ON p2.id = ord.id AND p2.status_number = 9 LEFT JOIN
         ****.status os1
         ON p1.status_number = os1.status_number LEFT JOIN
         ****.status os1
         ON p2.status_number = os2.status_number
         
    

    【讨论】:

    • 感谢您的回复,第二个将意味着我将有 2 个我不想要的字段。但是它看起来确实会起作用,我正在尝试的第一个,但只是测试我是否会获得状态编号为 9 的那些 id 的状态。
    • @Amar 。 . .那么你的问题就不清楚了。您需要提供样本数据和期望的结果。
    【解决方案3】:

    这些条件:

    ...AND p1.status_number = 10 AND p2.status_number = 9
    

    在 WHERE 子句中,将 LEFT 连接更改为 INNER 连接。

    仅使用 1 个连接到 progress 并在 ON 子句中设置这些条件:

    LEFT JOIN ****.progress p ON p.id = ord.id AND p.status_number IN (9, 10)
    LEFT JOIN ****.status os ON os.status_number = p.status_number 
    

    【讨论】:

    • 感谢您的回复,我在查询的末尾有另一行 'AND p1.datefield - p2.datefield > 2。所以不确定我是否应该使用 1 left join。但如果没有任何效果,我会尝试一下。
    • @amar 我的回答是关于您在问题中发布的代码。如果你的代码不同,那么你没有正确解释你想要什么。
    • 抱歉,如果我无法解决我的问题,我应该添加完整的查询,我会再次重新发布问题
    【解决方案4】:

    你可以这样做

    SELECT ****,
        ****,
        ****,
        ****,
        ****
    FROM ****.**** ord
        LEFT JOIN (SELECT p.*, os.* FROM progress p JOIN status os on p.status_number = os.status_number)  p1 ON p1.id = ord.id
        LEFT JOIN ****.progress p2 ON p2.id = ord.id
      
    WHERE ord.status_number = 10
        AND p1.status_number = 10
        AND p2.status_number = 9
    

    【讨论】:

    • 感谢您的回复,目前正在处理此问题,但遇到了错误,但看起来可以正常工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-16
    • 2020-06-25
    • 2013-08-30
    相关资源
    最近更新 更多