【问题标题】:Transform SELECT statememnt to JOIN将 SELECT 语句转换为 JOIN
【发布时间】:2013-05-15 11:16:05
【问题描述】:

我有一个类似的 sql 语句:

SELECT a.status_id,
       (SELECT batch_name
        FROM   pf_req_batch
        WHERE  batch_id = (SELECT batch_id
                           FROM   pf_m_req_batch
                           WHERE  request_id = 282)) AS BATCH_NAME
FROM   pf_request
WHERE  request_id = 282; 

我需要使用 JOIN 对其进行转换。请帮忙!

【问题讨论】:

  • 不太清楚你的意思...你需要加入 2 张桌子吗?

标签: sql select join


【解决方案1】:

你可以试试这个:

SELECT R.STATUS_ID, B.BATCH_NAME
FROM PF_REQUEST R
INNER JOIN PF_REQ_BATCH B ON B.BATCH_ID = R.PF_M_REQ_BATCH.BATCH_ID
WHERE REQUEST_ID=282;

【讨论】:

    【解决方案2】:
    SELECT A.STATUS_ID, b.BATCH_NAME  
    FROM PF_REQUEST A  inner join PF_REQ_BATCH as b
    on A.Batch_ID = b.Batch_Id
        WHERE A.REQUEST_ID=282;
    

    【讨论】:

      【解决方案3】:

      您涉及三个表。但是,您似乎不需要pf_req_batch,因为request_id 位于pf_requestpf_m_req_batch 中。

      此代码在pf_m_req_batch 表中查找batch_name。这是进行连接的一种方法:

      select r.status_id
      from pf_request r left outer join
           pf_req_batch rb
           on r.request_id = rb.request_id 
      where r.request_id = 282;
      

      注意left outer join 的使用。原始数据保留来自pf_request 的所有匹配记录。这种结构可能会产生重复(如果pf_m_req_batch 中有多个匹配的行。但是,根据您的原始查询,这不应该发生在您的情况下。如果发生这种情况,您将收到子查询错误(类似于返回的子查询多行)。

      【讨论】:

        【解决方案4】:
            SELECT PR.STATUS_ID, PRB.BATCH_NAME as BATCH_NAME 
                FROM PF_REQ_BATCH PRB, PF_M_REQ_BATCH PMRB,PF_REQUEST PR 
                WHERE PRB.BATCH_ID = PMRB.BATCH_ID 
                AND PMRB.REQUEST_ID = PR.REQUEST_ID 
                AND PR.REQUEST_ID=282;
        

        【讨论】:

          【解决方案5】:

          假设表pf_m_req_batch 是一个联结表并且(request_id, batch_id) 的组合是唯一的,这样可以:

          SELECT r.status_id,
                 b.batch_name
          FROM   pf_request  r
            LEFT JOIN pf_m_req_batch  rb
              ON rb.request_id = r.request_id
            LEFT JOIN pf_req_batch  b
              ON rb.batch_id = b.batch_id 
          WHERE  r.request_id = 282 ; 
          

          如果这不是唯一的(这更有可能),则此查询将显示许多行,与请求 282 关联的每个批次对应一个,而您的查询将引发错误。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-10-17
            • 2018-09-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多