一个移动电话问题。有一个邻接表,列出所有源和目标邻接。因此目标细胞可以是外部/边界细胞或正常细胞。因此,首先我要检查目标是否为正常单元格,如果不是,我想从外部单元格表中加载外部单元格列表。
因此,表为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语句而不是左联接。谢谢。
答案 0 :(得分:1)
我们可以使用UNION ALL
集合运算符,将C_ECELL
和C_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_id
和intl
中都出现相同的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子句中的条件向我们保证,我们在tgt
或ext
中找到了匹配的行;如果在任一行中都没有匹配的行,则earfcndl
列来自两个外部联接表的数据都将为NULL。)
答案 1 :(得分:0)
您需要加入UNION
和C_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