【问题标题】:Get multiple values from the same table based on a Join from a different table基于来自不同表的联接从同一个表中获取多个值
【发布时间】:2019-12-18 17:24:35
【问题描述】:

我有以下要求,我想使用同一个表连接多次从表中获取多个值。但我无法得到想要的结果。

下面是我尝试过的查询,它给出了重复的记录,还有很多时间在整个集合上运行。我尝试使用 distinct 但它的时间很多所以我不得不中止查询..

  SELECT 
HGHost.name AS HOST,
  HGDB.name        AS DATABASE,
  HGDB.dbms        AS DBMS,
  HGDB.server      AS INSTANCE,
  HGSCH.name       AS SCHEMA,
  HGTBL.name       AS "TABLE",
  HGCLM.name       AS "COLUMN",
  HGVAL.value    AS "HCDE",
  HGVAL1.value    AS "NOPI",
  HGVAL2.value    AS "Inf_CLAS"
FROM 
  XVIEW.XCATTR IGCCA INNER JOIN XVIEW.XCATTRSTRVAL HGVAL
  on IGCCA.RID=HGVAL.ofcustomattributeRID AND IGCCA.NAME = 'SURE_CLASS'
  INNER JOIN  XVIEW.XCATTRSTRVAL HGVAL1 
  ON IGCCA.RID =HGVAL1.ofcustomattributeRID  AND IGCCA.NAME = 'NO_CLASS'
  INNER JOIN XVIEW.XCATTRSTRVAL HGVAL2
  ON  IGCCA.RID =HGVAL2.ofcustomattributeRID  AND IGCCA.NAME= 'Info_class'
  INNER JOIN XVIEW.DBCLM HGCLM
  ON HGVAL.OBJECTRID = HGCLM.RID
  OR HGVAL1.OBJECTRID = HGCLM.RID
  OR HGVAL2.OBJECTRID = HGCLM.RID
  INNER JOIN XVIEW.PDRDATABASETABLE HGTBL
  ON HGCLM.ofdatabasetablerid = HGTBL.rid
  INNER JOIN XVIEW.PDRDATABASESCHEMA HGSCH
  ON HGTBL.ofdataschemarid      = HGSCH.rid
  INNER JOIN XVIEW.PDRDATABASE HGDB
  ON HGSCH.ofdatabaserid        = HGDB.rid
  INNER JOIN XVIEW.PDRHOSTSYSTEM HGHost
  ON HGDB.hostedbyrid           = HGHost.rid
  WHERE HGHost.name = 'PROD'
  AND HGDB.name <> 'teradata'

基本上,我希望根据 XCATTR 表中的连接条件,从此 XCATTRSTRVAL 中获取 HCDE、NOPI 和 Inf_clas 的值。 让我知道它是否清楚。 示例输出:(必须填写最后 3 个字段)

运行查询后,我得到如下两行。我想把它们合二为一。

【问题讨论】:

  • 添加具有预期输出的示例数据。
  • 当前查询有什么问题?它没有给出结果或为同一记录给出多个记录?编辑问题并添加提到的详细信息。
  • 是的,它给出了重复的记录。此外,当我在整个场景中运行时,它会花费很多时间。我认为它在进行交叉连接。
  • 两次加入同一个表INNER JOIN XVIEW.XCATTRSTRVAL HGVAL1 ON IGCCA.RID =HGVAL1.ofcustomattributeRID AND IGCCA.NAME = 'NO_CLASS' INNER JOIN XVIEW.XCATTRSTRVAL HGVAL2 ON IGCCA.RID =HGVAL2.ofcustomattributeRID AND IGCCA.NAME= 'Info_class' 会导致记录重复。您想在这里实现什么目标?
  • 我正在尝试根据与 XCATTR(名称列)的不同连接条件从表 XCATTRSTRVAL 中获取 NOPI、HCDE 和 INF_CLAS 的值

标签: sql oracle teradata


【解决方案1】:

试试这个:

SELECT
    HGHOST.NAME   AS HOST,
    HGDB.NAME     AS DATABASE,
    HGDB.DBMS     AS DBMS,
    HGDB.SERVER   AS INSTANCE,
    HGSCH.NAME    AS SCHEMA,
    HGTBL.NAME    AS "TABLE",
    HGCLM.NAME    AS "COLUMN",
    -- ADDED FOLLOWING AGGREGATE FUNCTIONS
    MAX(CASE
        WHEN IGCCA.NAME = 'SURE_CLASS' THEN HGVAL.VALUE
    END) AS "HCDE",
    MAX(CASE
        WHEN IGCCA.NAME = 'NO_CLASS' THEN HGVAL.VALUE
    END) AS "NOPI",
    MAX(CASE
        WHEN IGCCA.NAME = 'Info_class' THEN HGVAL.VALUE
    END) AS "Inf_CLAS"
FROM
    XVIEW.XCATTR IGCCA
    INNER JOIN XVIEW.XCATTRSTRVAL HGVAL ON IGCCA.RID = HGVAL.OFCUSTOMATTRIBUTERID
                                           AND IGCCA.NAME IN (
        'SURE_CLASS',
        'NO_CLASS',
        'Info_class'
    )
    INNER JOIN XVIEW.DBCLM HGCLM ON ( HGVAL.OBJECTRID = HGCLM.RID )
    INNER JOIN XVIEW.PDRDATABASETABLE HGTBL ON HGCLM.OFDATABASETABLERID = HGTBL.RID
    INNER JOIN XVIEW.PDRDATABASESCHEMA HGSCH ON HGTBL.OFDATASCHEMARID = HGSCH.RID
    INNER JOIN XVIEW.PDRDATABASE HGDB ON HGSCH.OFDATABASERID = HGDB.RID
    INNER JOIN XVIEW.PDRHOSTSYSTEM HGHOST ON HGDB.HOSTEDBYRID = HGHOST.RID
WHERE
    HGHOST.NAME = 'PROD'
    AND HGDB.NAME <> 'teradata'
GROUP BY -- ADDED THIS GROUP BY
    HGHOST.NAME,
    HGDB.NAME,
    HGDB.DBMS,
    HGDB.SERVER,
    HGSCH.NAME,
    HGTBL.NAME,
    HGCLM.NAME;

干杯!!

【讨论】:

  • HGVAL1 和 HGVAL2 连接??
  • 不需要!!如果结果不符合预期,请尝试此操作并分享
  • 但我收到错误:ORA-00904: "HGVAL2"."OBJECTRID": invalid identifier
  • 哦!更新了答案..请立即检查
  • 谢谢。我需要将两行合并为一行(存在值),这是在删除 group by 后得到的。
【解决方案2】:

如果你严格需要加入表XVIEW.XCATTRSTRVAL,我想你可以写下面的查询 -

SELECT HGHost.name AS HOST,
       HGDB.name        AS DATABASE,
       HGDB.dbms        AS DBMS,
       HGDB.server      AS INSTANCE,
       HGSCH.name       AS SCHEMA,
       HGTBL.name       AS "TABLE",
       HGCLM.name       AS "COLUMN",
       MAX(HGVAL.value)    AS "HCDE",
       MAX(CASE WHEN IGCCA.NAME = 'NO_CLASS' THEN HGVAL.value END) AS "NOPI",
       MAX(CASE WHEN IGCCA.NAME = 'Info_class' THEN HGVAL.value END) AS "Inf_CLAS"
FROM XVIEW.XCATTR IGCCA
INNER JOIN XVIEW.XCATTRSTRVAL HGVAL ON IGCCA.RID= HGVAL.ofcustomattributeRID 
                                    AND IGCCA.NAME IN ('SURE_CLASS', 'NO_CLASS', 'Info_class')
INNER JOIN XVIEW.DBCLM HGCLM ON HGVAL.OBJECTRID = HGCLM.RID
INNER JOIN XVIEW.PDRDATABASETABLE HGTBL ON HGCLM.ofdatabasetablerid = HGTBL.rid
INNER JOIN XVIEW.PDRDATABASESCHEMA HGSCH ON HGTBL.ofdataschemarid = HGSCH.rid
INNER JOIN XVIEW.PDRDATABASE HGDB ON HGSCH.ofdatabaserid = HGDB.rid
INNER JOIN XVIEW.PDRHOSTSYSTEM HGHost ON HGDB.hostedbyrid = HGHost.rid
WHERE HGHost.name = 'PROD'
AND HGDB.name <> 'teradata'
GROUP BY HGHost.name,
         HGDB.name,
         HGDB.dbms,
         HGDB.server,
         HGSCH.name,
         HGTBL.name,
         HGCLM.name

【讨论】:

  • HGVAL1 和 HGVAL2 没有定义?
  • 谢谢。我需要将两行合并为一(存在值)。查看更新的结果。
【解决方案3】:

大多数 DBMS 不喜欢 ORed 连接条件,在 Teradata 中它总是会导致(可能性能不佳)产品/交叉连接。这也是你得到太多行的原因,尝试重写为三个连接:

SELECT 
  HGHost.name AS HOST,
  HGDB.name        AS DATABASE,
  HGDB.dbms        AS DBMS,
  HGDB.server      AS INSTANCE,
  HGSCH.name       AS SCHEMA,
  HGTBL.name       AS "TABLE",
  HGCLM.name       AS "COLUMN",
  HGVAL.value    AS "HCDE",
  HGVAL1.value    AS "NOPI",
  HGVAL2.value    AS "Inf_CLAS"
FROM 
  XVIEW.XCATTR IGCCA
INNER JOIN XVIEW.XCATTRSTRVAL HGVAL
  ON IGCCA.RID= HGVAL.ofcustomattributeRID
 AND IGCCA.NAME = 'SURE_CLASS'
INNER JOIN XVIEW.DBCLM HGCLM
  ON  HGVAL.OBJECTRID = HGCLM.RID
INNER JOIN  XVIEW.XCATTRSTRVAL HGVAL1 
  ON IGCCA.RID=HGVAL1.ofcustomattributeRID
 AND IGCCA.NAME = 'NO_CLASS'
INNER JOIN XVIEW.DBCLM HGCLM1
  ON HGVAL1.OBJECTRID = HGCLM1.RID
INNER JOIN XVIEW.XCATTRSTRVAL HGVAL2
  ON IGCCA.RID=HGVAL2.ofcustomattributeRI
 AND IGCCA.NAME= 'Info_class'
INNER JOIN XVIEW.DBCLM HGCLM2
  ON HGVAL2.OBJECTRID = HGCLM2.RID
INNER JOIN XVIEW.PDRDATABASETABLE HGTBL
  ON HGCLM.ofdatabasetablerid = HGTBL.rid
INNER JOIN XVIEW.PDRDATABASESCHEMA HGSCH
  ON HGTBL.ofdataschemarid    = HGSCH.rid
INNER JOIN XVIEW.PDRDATABASE HGDB
  ON HGSCH.ofdatabaserid      = HGDB.rid
INNER JOIN XVIEW.PDRHOSTSYSTEM HGHost
  ON HGDB.hostedbyrid         = HGHost.rid
WHERE HGHost.name = 'PROD'
  AND HGDB.name <> 'teradata'

【讨论】:

  • 谢谢 Dnoeth。当我运行它时,我无法获得任何行。我再次检查一下
  • 尝试切换到 LEFT JOIN 以将那些加入 XVIEW.DBCLM
  • 还是没有结果。我能够得到结果,但我得到了要求中更新的两行。我只需要一行,其中包含最后三列中两行的所有值。
  • 您是否需要其他修改,例如左连接到XVIEW.XCATTRSTRVALGroup By + Max
【解决方案4】:

你真的需要多次加入同一个表吗?

你能用下面的吗?根据您的版本,您可能需要用 CASE 语句替换 IIF:

SELECT 
HGHost.name AS HOST,
  HGDB.name        AS DATABASE,
  HGDB.dbms        AS DBMS,
  HGDB.server      AS INSTANCE,
  HGSCH.name       AS SCHEMA,
  HGTBL.name       AS "TABLE",
  HGCLM.name       AS "COLUMN",
  IIF(IGCCA.NAME = 'SURE_CLASS',HGVAL.value,NULL)    AS "HCDE",
  IIF(IGCCA.NAME = 'NO_CLASS', HGVAL.value,NULL)    AS "NOPI",
  IIF(IGCCA.NAME = 'Info_class', HGVAL.value,NULL)    AS "Inf_CLAS"
FROM 
  XVIEW.XCATTR IGCCA
  INNER JOIN XVIEW.XCATTRSTRVAL HGVAL   on IGCCA.RID= HGVAL.ofcustomattributeRID AND IGCCA.NAME = 'SURE_CLASS'
  INNER JOIN XVIEW.DBCLM HGCLM
  ON HGVAL.OBJECTRID = HGCLM.RID
  INNER JOIN XVIEW.PDRDATABASETABLE HGTBL
  ON HGCLM.ofdatabasetablerid = HGTBL.rid
  INNER JOIN XVIEW.PDRDATABASESCHEMA HGSCH
  ON HGTBL.ofdataschemarid      = HGSCH.rid
  INNER JOIN XVIEW.PDRDATABASE HGDB
  ON HGSCH.ofdatabaserid        = HGDB.rid
  INNER JOIN XVIEW.PDRHOSTSYSTEM HGHost
  ON HGDB.hostedbyrid           = HGHost.rid
  WHERE HGHost.name = 'PROD'
  AND HGDB.name <> 'teradata'

【讨论】:

  • 这不起作用,因为 IGCCA 的 RID 对于所有三个 IGCCA.NAME 都不同,并且应该与 XCATTRSTRVAL 的自定义属性 RID 匹配以从 XCATTRSTRVAL 中选择值
  • 是的,所以如果您将 IGCCA 加入 XCATTRSTRVAL,您将获得所有 IGCCA.NAME 值。您是否尝试运行此查询?
  • 是的,我运行它更改为 Case 但出现错误:但我收到错误:ORA-00904: "HGVAL2"."OBJECTRID": invalid identifier
  • 好的,试试上面的。我做了一些改变。
猜你喜欢
  • 2020-04-09
  • 2021-10-10
  • 2018-12-08
  • 1970-01-01
  • 2022-08-19
  • 2016-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多