【问题标题】:How to show default value instead of not showing the whole record?如何显示默认值而不是不显示整个记录?
【发布时间】:2022-11-25 20:10:45
【问题描述】:

你能告诉我如何显示默认值而不是根本不显示整个记录吗?我有一个大学项目为维修服务做表格。每个订单都应该有 2 个操作员的 ID——进行诊断的操作员和进行维修的操作员。目前我有10个订单。他们每个人都有一个进行诊断的操作员。但是 10 个中只有 3 个有操作员进行维修。因此,我需要的记录中有7条没有经过修复操作,也没有与订单相关的修复操作。通过执行下面的查询,我只得到 10 条记录中的 3 条,因为其中 7 条记录没有经过修复操作。我该如何解决这个问题,以便获得所有 10 条记录,以便那些没有经过修复的记录获得默认值(例如 NULL)?

澄清: OPERATION_TYPE_ID = 2 表示诊断 OPERATION_TYPE_ID = 1 表示修复 如果我删除查询的最后一行,我将获得所有 10 条记录。

SELECT 
    MODEL AS "Model", 
    ENTRY_DATE AS "Entry date", 
    CLIENT_ID AS "Client ID",
    DEVICE_TYPE AS "Device type",
    OO1.OPERATOR_ID AS "Operator diagnostic",
    OO2.OPERATOR_ID AS "Operator repair"
FROM 
    P_DEVICE D, 
    P_ORDER O, 
    P_DEVICE_TYPE T, 
    P_ORDER_OPERATION OO1, 
    P_ORDER_OPERATION OO2
WHERE 
    D.DEVICE_ID = O.DEVICE_ID AND
    D.DEVICE_TYPE_ID = T.DEVICE_TYPE_ID AND
    (OO1.ORDER_ID = O.ORDER_ID AND OO1.OPERATION_TYPE_ID = 2) AND
    (OO2.ORDER_ID = O.ORDER_ID AND OO2.OPERATION_TYPE_ID = 1)

【问题讨论】:

  • 今日提示:切换到现代的、显式的 JOIN 语法。更易于编写(无错误),更易于阅读(和维护),并且更容易转换为外连接如果需要的话。
  • 我有更多的错误。但如果这是正确执行查询的唯一方法,我会尝试切换到它。
  • 隐式连接已经过时 30 年了!
  • 好吧,我不太关心语法。我有一项任务要做,我正在努力去做。现在我绝对不需要 SQL 来工作。但如果 JOIN 能够解决我的问题,我会尝试。
  • “好吧,我不太关心语法”-> 这在询问 SQL 问题时是一个极端的问题,因为语法是 SQL 中最决定性的事情。过时的逗号分隔表列表的工作方式类似于 INNER JOIN,但如果您想为不匹配的记录获取空值,则可能需要使用 LEFT JOIN。

标签: sql


【解决方案1】:

经过几个小时的尝试,这对我来说非常有效 =)

SELECT
    T.DEVICE_TYPE AS "Тип техниката",
    D.MODEL AS "Модел техника",
    O.ENTRY_DATE AS "Дата на постъпване",
    O.CLIENT_ID AS "Клиент ID",
    OO2.OPERATOR_ID AS "Служител диагностика ID",
    OO2.DESCRIPTION AS "Заключение след диагностика",
    OO2.DATE_END AS "Дата диагностика",
    OO1.OPERATOR_ID AS "ID служител, поел поръчката",
    OO1.DATE_END AS "Дата на приключване"
FROM
    P_ORDER O 
        LEFT JOIN P_ORDER_OPERATION OO1 ON O.ORDER_ID = OO1.ORDER_ID AND OO1.OPERATION_TYPE_ID = 1
        LEFT JOIN P_ORDER_OPERATION OO2 ON O.ORDER_ID = OO2.ORDER_ID AND OO2.OPERATION_TYPE_ID = 2
        INNER JOIN P_DEVICE D ON O.DEVICE_ID = D.DEVICE_ID
            INNER JOIN P_DEVICE_TYPE T ON D.DEVICE_TYPE_ID = T.DEVICE_TYPE_ID

【讨论】:

    猜你喜欢
    • 2015-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-09
    • 2021-08-17
    • 2019-08-10
    • 2018-04-26
    • 1970-01-01
    相关资源
    最近更新 更多