【问题标题】:Combining Columns from different tables组合来自不同表的列
【发布时间】:2017-10-18 09:10:14
【问题描述】:

我编写了一个SQL 代码来组合来自不同表的多个columns

SELECT *
FROM
(
    SELECT PD_BARCODE
    FROM docsadm.PD_BARCODE
    WHERE SYSTEM_ID = 11660081
) t,
(
    SELECT A_JAHRE
    FROM docsadm.A_PD_DATENSCHUTZ
    WHERE system_ID = 2066
) t2,
(
    SELECT PD_PART_NAME
    FROM docsadm.PD_FILE_PART
    WHERE system_id = 11660082
) t3;

代码工作正常,但如果在表中找不到我的 where 子句之一,即使其他列有值,结果也是 null。你如何解决这个问题?

【问题讨论】:

  • 没有加入条件?
  • 添加一些示例表数据和预期结果。全部为格式化文本。

标签: sql sql-server multiple-columns


【解决方案1】:

看起来您正在三个子查询表之间进行交叉连接。如果每个子查询返回一个值,这可能只会产生有意义的输出。我可能会建议您在这里使用UNION ALL

SELECT ISNULL(PD_BARCODE, 'NA' AS value
FROM docsadm.PD_BARCODE WHERE SYSTEM_ID = 11660081
UNION ALL
SELECT ISNULL(A_JAHRE, 'NA')
FROM docsadm.A_PD_DATENSCHUTZ WHERE system_ID = 2066
UNION ALL
SELECT ISULL(PD_PART_NAME, 'NA')
FROM docsadm.PD_FILE_PART WHERE system_id = 11660082

如果选择的三列不都具有相同的类型(我假设在我的查询中为varchar),则上述联合查询可能需要稍作修改。

如果您确实需要将这三个数据点作为单独的列,那么您可以将三个子查询作为项目包含在外部选择中:

SELECT
    (SELECT ISNULL(PD_BARCODE, 'NA')
     FROM docsadm.PD_BARCODE WHERE SYSTEM_ID = 11660081) AS PD_BARCODE,
    (SELECT ISNULL(A_JAHRE, 'NA')
     FROM docsadm.A_PD_DATENSCHUTZ WHERE system_ID = 2066) AS A_JAHRE,
    (SELECT ISNULL(PD_PART_NAME, 'NA')
     FROM docsadm.PD_FILE_PART WHERE system_id = 11660082) AS PD_PART_NAME;

请注意,如上所述,我们只是将子查询作为值包含在 select 语句中。但是当您编写原始查询时,您将子查询作为单独的表加入。

【讨论】:

  • @ertan2002 如果第一个查询出错,可能是因为列的类型不一样。在这种情况下,我们可以尝试将所有内容投射到 varchar 以进行显示。
  • 我对这部分有问题 => SELECT ISNULL(PD_BARCODE, 'NA' AS value 你写的是 ISULL 但我修好了它你错过了 parantesis 但仍然没有工作
【解决方案2】:

这里是Query

您可以将单词“empty”替换为您需要的单词或值

选择为空( ( 选择 PD_BARCODE FROM docsadm.PD_BARCODE WHERE SYSTEM_ID = 11660081 ), '空') 作为 PD_BARCODE, 一片空白( ( 选择 A_JAHRE 来自 docsadm.A_PD_DATENSCHUTZ 其中系统 ID = 2066 ), '空') 作为 A_JAHRE, 一片空白( ( 选择 PD_PART_NAME FROM docsadm.PD_FILE_PART 在哪里 system_id = 11660082 ), '空') 作为 PD_PART_NAME;

【讨论】:

    【解决方案3】:

    这是一种特殊情况,因为您尝试将其设置为列的每个查询只会获得一个值。在这种情况下,您可以将 SQL PIVOT clause 与 UNION ALL 查询一起使用,如下所示。在这种情况下,可以使用 MIN 进行聚合。

    这意味着,您可以随心所欲地逐行获取数据,甚至针对多个不同的字段,然后一次性将其转为列。

    SELECT * FROM 
     (
       SELECT 'PD_BARCODE' as KeyItem, PD_BARCODE Name from docsadm.PD_BARCODE 
       where SYSTEM_ID=11660081
    
       UNION ALL
       SELECT 'A_JAHRE', A_JAHRE from docsadm.A_PD_DATENSCHUTZ 
       where system_ID=2066
    
       UNION ALL
       select 'PD_PART_NAME', PD_PART_NAME from docsadm.PD_FILE_PART 
       where system_id=11660082
    
     ) VTABLE
    PIVOT(MIN(Name) 
         FOR KeyItem IN ([PD_BARCODE], [A_JAHRE], [PD_PART_NAME])) as pivotData;  
    

    【讨论】:

    • 非常感谢您的解释。使用枢轴更好?因为其他查询也有效
    • 基本上取决于查询生成的执行计划。我建议您检查每个查询的实际执行计划,并检查具有最佳执行计划和数据检索时间的查询。毫无疑问,这是让 sql person 了解查询中到底发生了什么的更直观的语法。
    • 再次感谢您 :) 它假设只返回一个字段,因为我使用系统 ID 并从每个表中仅检索一个字段。我认为应该没有那么多性能问题..
    • 不,不应该。但我仍然建议您检查实际的执行计划。有时可能会令人惊讶。
    猜你喜欢
    • 2018-01-07
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多