即使查询结果为空,也可以使用合成表联合表来获取结果

时间:2018-05-17 13:25:55

标签: sql oracle

我有一个数据表,我想选择一些按日期过滤的字段。 如果结果为空,则根据sysdate我需要确定它是否正常。 为了能够做到这一点,我正在创建一个带有标志字段的合成表,我期望在结果集中填充该表,即使在该日期我的实际表中没有数据。

WITH const AS (
 SELECT 
     'NAME 1' AS name,
      (CASE WHEN TO_TIMESTAMP(TO_CHAR(CURRENT_TIMESTAMP, 'HH24:MI:SS'), 'HH24:MI:SS') < TO_TIMESTAMP('01:00:00', 'HH24:MI:SS') THEN 1 ELSE 0 END) AS flag
 FROM
      Data_Table
 UNION
 SELECT
      'ANY NAME' AS name,
       (CASE WHEN TO_TIMESTAMP(TO_CHAR(CURRENT_TIMESTAMP, 'HH24:MI:SS'), 'HH24:MI:SS') < TO_TIMESTAMP('01:00:00', 'HH24:MI:SS') THEN 1 ELSE 0 END) AS flag )
SELECT Data_Table.sysname, const.flag FROM const LEFT OUTER JOIN Data_Table ON Data_Table.sysname = const.name WHERE Data_Table.date=TO_CHAR(sysdate, 'DD-MM-YYYY')

我希望得到如下结果:

sysname       flag

Name1          1
(null)         1

但如果没有该日期的数据,则获得空结果。

2 个答案:

答案 0 :(得分:0)

这是一般的例子。如果我理解正确,即使查询没有返回任何行,也需要能够返回一个值:

SELECT table_name FROM all_tables
 WHERE table_name = 'YOUR_TABLE'
UNION ALL
SELECT '1' table_name FROM dual
 WHERE NOT EXISTS
(
SELECT table_name FROM all_tables
 WHERE table_name = 'YOUR_TABLE'
)
/

结果是1,因为没有表格,因为“你的时间”是这样的。在我的数据库中。但是如果我输入一个有效的表名,那么我将从顶部查询中获得结果。如果没有,则始终从第二个查询中获取1或任何其他值。两个查询中的表名必须相同。第二个是最重要的副本。

答案 1 :(得分:0)

我在上一个语句中看到了问题

SELECT Data_Table.sysname, const.flag 
  FROM const 
  LEFT OUTER JOIN Data_Table 
    ON Data_Table.sysname = const.name 
 WHERE Data_Table.date=TO_CHAR(sysdate, 'DD-MM-YYYY')-- Here is the problem

您正在执行左外连接,然后使用where条件过滤数据,在这种情况下where条件永远不会为真。您需要将该条件推送到连接中,以便它不会影响整体结果:

SELECT Data_Table.sysname, const.flag 
  FROM const 
  LEFT OUTER JOIN Data_Table 
    ON Data_Table.sysname = const.name 
   AND Data_Table.date=TO_CHAR(sysdate, 'DD-MM-YYYY')