Oracle SQL保留数据即使在另一个表列参数上也显示



我想用另一个表显示带有参数DESCRIPTIONID的数据。

现在,我想保留数据显示的数据,即使在另一个表上显示为空/空(不存在描述ID)。

以下查询工作,如果两个表都有DESCRIPTIONID

SELECT D.DESCRIPTIONID, D.DESCRIPTION, D.PROFILEID_FK, D.ACTIVE, P.PROFILEID, P.PROFILE_NAME FROM WA_BT_TBL_DESCRIPTION D, WA_BT_TBL_PROFILE P WHERE D.PROFILEID_FK = P.PROFILEID AND D.PROFILEID_FK = 'PF0001' AND D.ACTIVE = 'Y' ORDER BY D.DATEADDED ASC

和我要改进的查询:

SELECT
DISTINCT
D.DESCRIPTIONID,
D.DESCRIPTION,
Y.TIME
FROM
WA_BT_TBL_DESCRIPTION D,
WA_BT_TBL_DAY Y
WHERE
D.DESCRIPTIONID = Y.DESCRIPTIONID_FK AND
D.PROFILEID_FK = Y.PROFILEID_FK AND
D.PROFILEID_FK = 'PF0001'
ORDER BY Y.TIME ASC

让我们看看SQL小提琴

请在SQL小提琴上尝试两个查询。如您所见,我想要"休息时间II"保持展示。

最后,我想要以下查询显示:

DESCRIPTIONID   DESCRIPTION          TIME
DS0003          Break Time I         10:00
DS0001          Operator Clock Time  15:30
DS0002          Working Time I       17:00
DS0024          Break Time II             <-- keep show this row(null/empty)

使用外部联接。

在较旧的情况下,很难理解语法(您使用的语法),如这样(在条件下请注意(+)):

SELECT
DISTINCT
  D.DESCRIPTIONID,
  D.DESCRIPTION,
  Y.TIME
FROM
  WA_BT_TBL_DESCRIPTION D,
  WA_BT_TBL_DAY Y
WHERE
  D.DESCRIPTIONID = Y.DESCRIPTIONID_FK(+) AND
  D.PROFILEID_FK = Y.PROFILEID_FK(+) AND
  D.PROFILEID_FK = 'PF0001'
ORDER BY Y.TIME ASC

在更令人鼓舞的一个中(明确编写LEFT JOIN...ON):

SELECT
  DISTINCT
  D.DESCRIPTIONID,
  D.DESCRIPTION,
  Y.TIME
FROM
  WA_BT_TBL_DESCRIPTION D LEFT JOIN
  WA_BT_TBL_DAY Y ON D.DESCRIPTIONID = Y.DESCRIPTIONID_FK AND
  D.PROFILEID_FK = Y.PROFILEID_FK AND
  D.PROFILEID_FK = 'PF0001'
ORDER BY Y.TIME ASC

几件事,您不旧样式JOIN它们已经过时了,您只需要一个LEFT OUTER JOIN即可。查询上的WHERE子句限制了两个表中存在的结果:

WHERE
D.DESCRIPTIONID = Y.DESCRIPTIONID_FK 

这本质上是INNER JOIN

尝试以下操作:

SELECT 
  D.DESCRIPTIONID, 
  D.DESCRIPTION,
  Y.TIME
FROM 
WA_BT_TBL_DESCRIPTION D
LEFT OUTER JOIN WA_BT_TBL_DAY Y ON D.DESCRIPTIONID = Y.DESCRIPTIONID_FK
WHERE
D.PROFILEID_FK = 'PF0001'
ORDER BY Y.TIME ASC

这里有一个帖子,解释了不同类型的连接真的很好

最新更新