我想用另一个表显示带有参数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
这里有一个帖子,解释了不同类型的连接真的很好