合并来自不同表格的列

时间:2017-10-18 09:10:15

标签: sql sql-server multiple-columns

我编写了一个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,即使其他列具有值。你怎么解决这个问题?

3 个答案:

答案 0 :(得分: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语句中。但是在编写原始查询时,您将子查询作为单独的表加入。

答案 1 :(得分: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;

答案 2 :(得分: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;