有一个join和union的select语句,无法使其工作

时间:2018-11-20 21:03:51

标签: mysql

一个移动电话问题。有一个邻接表,列出所有源和目标邻接。因此目标细胞可以是外部/边界细胞或正常细胞。因此,首先我要检查目标是否为正常单元格,如果不是,我想从外部单元格表中加载外部单元格列表。 因此,表为c_adjacent_cell_4g,普通单元格表为c_ecell,目标单元格可以来自c_ecell表或c_externaleutrancellfdd表。请注意,源单元将始终是普通单元,目标单元可以是普通单元或外部单元。因此,对于我在选择语句时所做的相当糟糕的尝试。

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语句而不是左联接。谢谢。

2 个答案:

答案 0 :(得分:1)

我们可以使用UNION ALL集合运算符,将C_ECELLC_EXTERNALEUTRANCELLFDD中的行合并为一个集合,作为内联视图,然后加入合并的集合:< / p>

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_idintl中都出现相同的extl值,则联接操作将匹配两行。


但是我会避免使用UNION ALL方法。而是对两个目标表进行外部联接。然后进行检查(在SELECT列表中的表达式中)以确定是否在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子句中的条件向我们保证,我们在tgtext中找到了匹配的行;如果在任一行中都没有匹配的行,则earfcndl列来自两个外部联接表的数据都将为NULL。)

答案 1 :(得分:0)

您需要加入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