2017-10-18 132 views
2

我已经编写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子句未在表中找到了我的一个,结果是空甚至其他列具有价值。你如何解决这个问题?

+0

没有加入条件吗? – jarlh

+0

添加一些示例表格数据和预期结果。全部作为格式化文本。 – jarlh

回答

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语句中的值。但是,当您编写原始查询时,您将作为单独的表加入子查询。

+0

perfekt第二个查询效果很好 – ertan2002

+0

@ ertan2002如果第一个查询出错,可能是因为列的类型不一样。在这种情况下,我们可以尝试将所有内容转换为'varchar'用于显示目的。 –

+0

我有这部分的问题=> SELECT ISNULL(PD_BARCODE,'NA'AS值和你写了ISULL,但我修复了它,你错过了parantesis但仍然不工作 – ertan2002

1

这是Query

您可以通过您所需的字或值替换单词“empty

 

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

+0

它也可以,谢谢 – ertan2002

1

这是因为你会得到每个你查询你正试图把达作为唯一的一个值的特殊情况下,柱。在这种情况下,您可以使用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; 
+0

非常感谢你的解释使用pivot更好吗?因为其他查询也在工作 – ertan2002

+0

它基本上取决于查询生成的执行计划。我建议您检查每个查询的实际执行计划,并检查具有最佳执行计划和数据检索时间的查询。没有问题,这是SQL人更直观的语法来理解查询中究竟发生了什么 – Amit

+0

再次感谢你:)它假设只返回一个字段,因为我使用的是系统ID,并且只检索每个表中的一个字段。我认为应该没有那么多的性能问题.. – ertan2002

相关问题