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