有一个带有连接和联合的select语句,无法使其工作

e0bqpujr  于 2021-06-19  发布在  Mysql
关注(0)|答案(2)|浏览(263)

所以一个移动电话问题。有一个邻接表列出所有的源和目标邻接。所以目标细胞可以是外/边界细胞或正常细胞。因此,首先我要检查目标是否是一个普通单元格,如果不是,我要从externalcell表中加载外部单元格列表。所以table是 c_adjacent_cell_4g ,正常单元格表为 c_ecell 目标细胞可以来自 c_ecell 桌上或桌上 c_externaleutrancellfdd table。注意:源单元格始终是正常单元格,目标单元格可以是正常单元格或外部单元格。因此,我在选择一个声明时做得很糟糕。

SELECT INT_ID, int_id 
FROM (
    SELECT adj.int_id, if(src.earfcnDl = tgt.earfcnDl, 'ADJS', 'ADJI') AS TYPE 
    FROM C_ADJACENT_CELL_4G adj 
    JOIN C_ECELL src ON (src.int_id = adj.src_cell_int_id) 
    JOIN C_ECELL tgt ON (tgt.int_id = adj.adj_cell_int_id) 
    LEFT JOIN C_EXTERNALEUTRANCELLFDD tgt ON (tgt.int_id = adj.adj_cell_int_id) 
    WHERE src.earfcndl IS NOT NULL AND tgt.earfcndl IS NOT NULL) DATA;

有没有可能我应该使用union语句而不是left join。谢谢。

dwbf0jvd

dwbf0jvd1#

我们可以利用一个 UNION ALL set运算符,用于合并来自 C_ECELL 以及 C_EXTERNALEUTRANCELLFDD 作为内联视图合并到单个集合中,然后合并到组合集合中:

SELECT ...

  FROM C_ADJACENT_CELL_4G adj
  JOIN ( 
         SELECT 'i' AS src
              , intl.int_id
              , intl.earfcndl
           FROM C_ECELL int
          UNION ALL
         SELECT 'e' AS src
              , extl.int_id
              , extl.earfcndl
           FROM C_EXTERNALEUTRANCELLFDD extl
       ) tgt
    ON tgt.int_id = ...

如果相同的 int_id 出现在两个 intl 以及 extl ,联接操作将匹配这两行。
但我会避免工会的做法。而是对两个目标表进行外部联接。然后进行检查(在选择列表中的表达式中)以确定是否在中找到匹配项 C_ECELL . 如果不是的话,我们一定找到了匹配的 C_EXTERNALEUTRANCELLFDD .
大致如下:

SELECT adj.int_id     AS _adj__int_id
     , src.int_id     AS _src__int_id
     , tgt.int_id     AS _tgt__int_id
     , ext.int_id     AS _ext__int_id

     , src.earfcndl   AS _src__earfcndl
     , tgt.earfcndl   AS _tgt__earfcndl
     , ext.earfcndl   AS _ext__earfcndl

     , IF(adj.adj_cell_int_id = tgt.int_id, 'internal', 'external')

  FROM C_ADJACENT_CELL_4G adj

  JOIN C_ECELL src
    ON src.int_id = adj.src_cell_int_id

  LEFT
  JOIN C_ECELL tgt
    ON tgt.int_id = adj.adj_cell_int_id

  LEFT
  JOIN C_EXTERNALEUTRANCELLFDD ext
    ON ext.int_id = adj.adj_cell_int_id

 WHERE src.earfcndl IS NOT NULL
   AND ( tgt.earfcndl IS NOT NULL OR ext.earfcndl IS NOT NULL )

(where子句中的条件保证我们在其中一个 tgt 或者 ext ; 如果两行中都没有匹配的行,那么 earfcndl 两个外部联接表中的列都将为空。)

hzbexzde

hzbexzde2#

你需要加入一个 UNIONC_ECELL 以及 C_EXTERNALEUTRANCELLFDD .

SELECT adj.int_id, if(src.earfcnDl = tgt.earfcnDl, 'ADJS', 'ADJI') AS TYPE 
FROM C_ADJACENT_CELL_4G adj 
JOIN C_ECELL src ON (src.int_id = adj.src_cell_int_id) 
JOIN (
    SELECT int_id, earfcnDl
    FROM C_ECELL
    WHERE earfcndl IS NOT NULL
    UNION
    SELECT int_id, earfcnDl
    FROM C_EXTERNALEUTRANCELLFDD
    WHERE earfcndl IS NOT NULL) AS tgt ON (tgt.int_id = adj.adj_cell_int_id) 
WHERE src.earfcndl IS NOT NULL

相关问题