【问题标题】:Select distinct one column oracle [closed]选择不同的一列 oracle [关闭]
【发布时间】:2015-10-09 16:02:24
【问题描述】:

这是我的查询

SELECT PHMR_ID,
  NVOL_MVT_COD,
  TO_CHAR(DATE_PREVUE, 'DD/MM/YYYY')     AS DATE_PREVUE,
  TO_CHAR(DATE_ORIGINE_LT, 'DD/MM/YYYY') AS DATE_ORIGINE_LT,
  HTAD,
  DHC_AFF,
  PKG,
  PKG_GEO,
  GATE,
  TTB,
  BQE,
  SALLE,
  ESCALE,
  TA_CLE,
  IM_IMMAT,
  VOL_NB_PAX_GLOB,
  VOL_CRIT_DOUANIER,
  VOL_PROTOCOLE,
  VOL_CORRESP,
  VOL_ETAT_VOL,
  NVL(TAS_GLOB, TER_COD1)                      AS TAS_GLOB,
  NVL(TER_TRAITEMENT, NVL(TAS_GLOB, TER_COD1)) AS TER_TRAITEMENT,
  NUM_SIEGE,
  VOL_ROT,
  INFO_SUP,
  TYPE_PREMIER_MSG,
  PREMIER_MSG,
  TYPE_DERNIER_MSG,
  DERNIER_MSG,
  TYP_JOUR,
  PHMR_ID_ARP,
  DECODE(NVOL_MVT_COD,'A',PHMR_ID_ARP,NULL) AS ID_ARP_A,
  DECODE(NVOL_MVT_COD,'D',PHMR_ID_ARP,NULL) AS ID_ARP_D,
  TYP_HORAIRE,
  DUREE_CORRESP,
  HOTEL,
  TYPE_CONTACT,
  RET_COD1,
  RET_LIB1,
  RET_COD2,
  RET_LIB2,
  HBLOC,
  DISTINCT_LOT_CORRESPONDANCE,
  OTHER_TYPE_MR,
  TYPE_CHAISE,
  STATUS_PHMR,
  LISTE_MSG,
  LIEU_RDV,
  CLASSE,
  PHMR_PRESTA_ID,
  PRESTA,
  DECODE(HORS_DELAI,1,'OUI','NON') AS HORSDELAI
FROM VW_PHMR
WHERE VW_PHMR.DATE_PREVUE >= to_date('06/07/2015','DD/MM/YYYY')
AND VW_PHMR.DATE_PREVUE   <= to_date('06/07/2015','DD/MM/YYYY')
AND (phmr_valide          IS NULL
OR phmr_valide             ='O')
ORDER BY VW_PHMR.DATE_PREVUE ASC,
  DHC ASC,
  PHMR_ID ASC

我只需要获取不同的 PHMR_ID(仅此列上的不同),我该怎么做?

要清楚;我有一个看法: CREATE OR REPLACE FORCE VIEW VW_PHMR ( PHMR_ID, TER_COD1, PHMR_NOM, PHMR_PRENOM, TYPE_MR, CIE_SARIA, CIE_COD_IATA, CIE_COD_OACI, NVOL_LIG_NUM, NVOL_MVT_COD, DATE_PREVUE, DATE_ORIGINE_LT, DHC, HTAD, DHC_AFF, PKG, PKG_GEO, GATE, TTB, BQE, SALLE, ESCALE, TA_CLE, IM_IMMAT, VOL_NB_PAX_GLOB, VOL_CRIT_DOUANIER, VOL_PROTOCOLE, VOL_CORRESP, VOL_ETAT_VOL, TAS_GLOB, TER_TRAITEMENT, NUM_SIEGE, VOL_ROT, INFO_SUP, PREMIER_MSG, TYPE_PREMIER_MSG, DERNIER_MSG, TYPE_DERNIER_MSG, TYP_JOUR, PHMR_ID_ADP, TYP_HORAIRE, DUREE_CORRESP, HOTEL, TYPE_CONTACT, RET_COD1, RET_LIB1, RET_COD2, RET_LIB2, HBLOC, DISTINCT_LOT_CORRESPONDANCE, OTHER_TYPE_MR, TYPE_CHAISE, STATUS_PHMR, ID_STATUS, LISTE_MSG, LIEU_RDV, CLASSE, PHMR_VALIDE, PHMR_PRESTA_ID, PRESTA, HORS_DELAI ) AS SELECT DISTINCT p.phmr_id, p.ter_cod1, p.phmr_nom, p.phmr_prenom, p.liste_mr AS type_mr, p.cie_cle AS cie_saria, c.cie_cod_iata, c.cie_cod_oaci, p.nvol_lig_num, p.nvol_mvt_cod, p.date_exp AS date_prevue, p.vol_dt AS date_origine_lt, v.dhc AS DHC, TO_CHAR (v.HTAD, 'HH24:MI') AS HTAD, DECODE ( v.vol_hadb, NULL, v.DHC_TYP || TO_CHAR (v.dhc, 'HH24:MI'), DECODE (v.dhc_typ, 'N', 'D', v.dhc_typ) || TO_CHAR (v.vol_hadb, 'HH24:MI')) AS DHC_AFF, v.parking AS PKG, v.pkg_geo AS PKG_GEO, v.porte AS GATE, v.tapis AS TTB, v.banque AS BQE, v.salle AS SALLE, v.escale AS ESCALE, v.ta_cle, v.im_immat, v.vol_nb_pax_glob, v.vol_crit_douanier, v.protocole AS VOL_PROTOCOLE, p.vol_corresp, v.vol_etat_vol, v.tas_glob, v.tas_af_pax AS TER_TRAITEMENT, p.num_siege, v2.cie_cle || v2.nvol_lig_num AS vol_rot, p.INFO_SUP AS INFO_SUP, TO_CHAR (p.DH_PREMIER_MSG, 'DD/MM/YYYY HH24:MI') AS premier_msg, tm.typmes_cod AS type_premier_msg, TO_CHAR (p.DH_DERNIER_MSG, 'DD/MM/YYYY HH24:MI') AS dernier_msg, tm2.typmes_cod AS type_dernier_msg, DECODE (p.TYP_JOUR, NULL, 'S', p.TYP_JOUR), p.PHMR_ID_ADP, DECODE (p.TYP_HORAIRE, NULL, 'J', p.TYP_HORAIRE), p.DUREE_CORRESP, p.HOTEL, v.TYPE_CONTACT, v.RET_COD1, v.RET_LIB1, v.RET_COD2, v.RET_LIB2, v.vol_hadb, p.DISTINCT_LOT_CORRESPONDANCE, p.TYPE_MR, P.TYPE_CHAISE, sp.status_lib_court AS STATUS_PHMR, sp.PHMR_STATUS AS ID_STATUS, p.liste_message AS liste_msg, p.phmr_lieupc AS lieu_rdv, p.phmr_classe AS classe, p.phmr_valide AS phmr_valide, p.phmr_presta_id, p.presta, p.HORS_DELAI FROM phmr p, cie c, vw_vols v, vw_vols v2, type_messages tm, type_messages tm2, status_phmr sp WHERE c.cie_cle(+) = p.cie_cle AND v.vol_ident(+) = p.vol_ident AND v2.vol_ident(+) = v.vol_ident_rot AND tm.msg_typ(+) = p.TYP_PREMIER_MSG AND tm2.msg_typ(+) = p.TYP_DERNIER_MSG AND sp.phmr_status(+) = p.phmr_status;

当我在这个视图上执行这个命令时,我有 1904 行

现在,我需要一个左连接来获得另一列(我必须总是有 1904 行),所以我像这样修改我的视图 CREATE OR REPLACE FORCE VIEW VW_PHMR ( PHMR_ID, TER_COD1, PHMR_NOM, PHMR_PRENOM, TYPE_MR, CIE_SARIA, CIE_COD_IATA, CIE_COD_OACI, NVOL_LIG_NUM, NVOL_MVT_COD, DATE_PREVUE, DATE_ORIGINE_LT, DHC, HTAD, DHC_AFF, PKG, PKG_GEO, GATE, TTB, BQE, SALLE, ESCALE, TA_CLE, IM_IMMAT, VOL_NB_PAX_GLOB, VOL_CRIT_DOUANIER, VOL_PROTOCOLE, VOL_CORRESP, VOL_ETAT_VOL, TAS_GLOB, TER_TRAITEMENT, NUM_SIEGE, VOL_ROT, INFO_SUP, PREMIER_MSG, TYPE_PREMIER_MSG, DERNIER_MSG, TYPE_DERNIER_MSG, TYP_JOUR, PHMR_ID_ADP, TYP_HORAIRE, DUREE_CORRESP, HOTEL, TYPE_CONTACT, RET_COD1, RET_LIB1, RET_COD2, RET_LIB2, HBLOC, DISTINCT_LOT_CORRESPONDANCE, OTHER_TYPE_MR, TYPE_CHAISE, DERNIER_JALON, STATUS_PHMR, ID_STATUS, LISTE_MSG, LIEU_RDV, CLASSE, PHMR_VALIDE, PHMR_PRESTA_ID, PRESTA, HORS_DELAI ) AS SELECT DISTINCT p.phmr_id, p.ter_cod1, p.phmr_nom, p.phmr_prenom, p.liste_mr AS type_mr, p.cie_cle AS cie_saria, c.cie_cod_iata, c.cie_cod_oaci, p.nvol_lig_num, p.nvol_mvt_cod, p.date_exp AS date_prevue, p.vol_dt AS date_origine_lt, v.dhc AS DHC, TO_CHAR (v.HTAD, 'HH24:MI') AS HTAD, DECODE ( v.vol_hadb, NULL, v.DHC_TYP || TO_CHAR (v.dhc, 'HH24:MI'), DECODE (v.dhc_typ, 'N', 'D', v.dhc_typ) || TO_CHAR (v.vol_hadb, 'HH24:MI')) AS DHC_AFF, v.parking AS PKG, v.pkg_geo AS PKG_GEO, v.porte AS GATE, v.tapis AS TTB, v.banque AS BQE, v.salle AS SALLE, v.escale AS ESCALE, v.ta_cle, v.im_immat, v.vol_nb_pax_glob, v.vol_crit_douanier, v.protocole AS VOL_PROTOCOLE, p.vol_corresp, v.vol_etat_vol, v.tas_glob, v.tas_af_pax AS TER_TRAITEMENT, p.num_siege, v2.cie_cle || v2.nvol_lig_num AS vol_rot, p.INFO_SUP AS INFO_SUP, TO_CHAR (p.DH_PREMIER_MSG, 'DD/MM/YYYY HH24:MI') AS premier_msg, tm.typmes_cod AS type_premier_msg, TO_CHAR (p.DH_DERNIER_MSG, 'DD/MM/YYYY HH24:MI') AS dernier_msg, tm2.typmes_cod AS type_dernier_msg, DECODE (p.TYP_JOUR, NULL, 'S', p.TYP_JOUR), p.PHMR_ID_ADP, DECODE (p.TYP_HORAIRE, NULL, 'J', p.TYP_HORAIRE), p.DUREE_CORRESP, p.HOTEL, v.TYPE_CONTACT, v.RET_COD1, v.RET_LIB1, v.RET_COD2, v.RET_LIB2, v.vol_hadb, p.DISTINCT_LOT_CORRESPONDANCE, p.TYPE_MR, P.TYPE_CHAISE, **p2.TYP_DERNIER_JALON AS DERNIER_JALON**, sp.status_lib_court AS STATUS_PHMR, sp.PHMR_STATUS AS ID_STATUS, p.liste_message AS liste_msg, p.phmr_lieupc AS lieu_rdv, p.phmr_classe AS classe, p.phmr_valide AS phmr_valide, p.phmr_presta_id, p.presta, p.HORS_DELAI FROM phmr p, **phmr_presta p2**, cie c, vw_vols v, vw_vols v2, type_messages tm, type_messages tm2, status_phmr sp WHERE c.cie_cle(+) = p.cie_cle AND v.vol_ident(+) = p.vol_ident AND v2.vol_ident(+) = v.vol_ident_rot AND tm.msg_typ(+) = p.TYP_PREMIER_MSG AND tm2.msg_typ(+) = p.TYP_DERNIER_MSG AND sp.phmr_status(+) = p.phmr_status **AND p.phmr_id(+) = p2.phmr_id**;

我该如何解决这个问题?

问候

【问题讨论】:

  • 按 PHMR_ID 使用组
  • 您必须决定为其他列返回什么值。 Min? Max? sum?、Count 或其他聚合函数。否则你不能只得到一个“不同的”。您可以编写一个单独的查询来仅返回该列的不同值......显示一些数据和预期结果,我们可能能够找出不同的方法(或编写 SQLFIDDLE.com)
  • 我在另一条评论中解释了我的需求
  • 根据您的评论/答案...您遇到的问题是phmrphmr_presta 之间存在一对多关系。由于您似乎只需要来自phmr_presta 表的TYP_DERNIER_JALON...您需要什么值?最老的?最新?他们都是?需要处理 1-many 以保留 1904 年的记录计数再次示例数据将有助于在这里显示 phmr.phmr_ID = 1 和 phmr_presta.phmr_id 有多个 1 ......知道你追求哪一个会有所帮助。这不是一个明显的问题,它可能是一个 SET 问题。加入前需要限制phmr_presta表数据集
  • 是的,phmr 和 phmr_presta 之间是一对多关系,所以我需要 phmr_presta 提供的最新 TYP_DERNIER_JALON。加入前如何限制phmr_presta表数据集?

标签: sql oracle oracle11g


【解决方案1】:

我想如果你替换:

 FROM phmr p,
      **phmr_presta p2**,

FROM phmr p,
(SELECT IP1.PHMR_ID, IP1.TYP_DERNIER_JALON
FROM phmr_Presta IP1,
       (SELECT phmr_id, max(phmr_presta_id) M_PRESTA_ID
        FROM   phmr_presta
        GROUP BY phmr_id
       ) IP2
where IP1.PHMR_ID = IP2.PHMR_ID
  and IP1.PHMR_PRESTA_ID = IP2.M_PRESTA_ID) P2

你会得到想要的结果。

这样做是获取 phmr_presta 中每个 phmr_ID 的 max_PHMR_PRESETA_ID。然后它加入回 PHMR_PRESTA 以获取您所追求的 TYP_DERNIER_JALON。然后我将其替换为您拥有的表,因为这是该表的子集。

可能有一种更有效的方式来编写整个视图。但我关注的是你遇到的具体问题,而不是整体观点。哦... 在此之后您不应该需要 distinct...

如果您使用示例数据创建小提琴,我可以对此进行测试,但如果没有您提供的数据和模型,我不倾向于这样做。所以这是未经测试的,可能有一些语法错误。

未来问题的注意事项:消除所有额外的列等。将问题分解为最简单的形式并将其作为问题提出。这里额外的列和表是“噪音”,但这有点让人思考;而且完全没有必要。

【讨论】:

  • 非常感谢您的回答和建议。我认为语法不正确!
【解决方案2】:

这就是你可以做到的。如果你想要别的东西,那么别忘了写一个更好的规范。

select distinct PHMR_ID
from VW_PHMR

【讨论】:

  • 我在另一条评论中解释了我的需求
猜你喜欢
  • 2015-01-11
  • 1970-01-01
  • 2017-05-06
  • 1970-01-01
  • 1970-01-01
  • 2019-02-06
  • 1970-01-01
  • 2013-07-31
  • 2010-12-19
相关资源
最近更新 更多