mysql - 用于显示临时状态的 SELECT 语句(两个表)

标签 mysql sql

我对标题感到抱歉,但我找不到正确的措辞。

情况:我有一个包含两个表的架构:

检查结果:

  • 节点名称
  • requirement_number
  • 状态
  • 原因
  • 来源

接受

  • 节点名称
  • requirement_number
  • 状态
  • 原因
  • valid_from
  • 有效期至
  • 接受者(邮件/姓名...)

因此,我们的想法是显示由 check_table 中的多个条目组成的检查的状态,其中现有的有效接受“覆盖” check_table 的结果/状态。一开始,并非所有信息都是必要的。输出应包含:

requirement_number | status | reason | source/acceptor

我怎样才能实现这个目标?

编辑:请求的输出

sec_ora_acceptance | CREATE TABLE `sec_ora_acceptance` (
  `node_name` varchar(20) NOT NULL,
  `instance_oracle_sid` varchar(20) NOT NULL,
  `req_no` int(11) NOT NULL,
  `status` enum('OK','NOK','OPEN','NA') NOT NULL,
  `reason` text NOT NULL,
  `acceptor` varchar(45) NOT NULL,
  `acceptor_mail` varchar(50) DEFAULT NULL,
  `date` date NOT NULL,
  `valid_until` date DEFAULT '9999-12-31',
  PRIMARY KEY (`node_name`,`instance_oracle_sid`,`req_no`)
)

sec_ora_result | CREATE TABLE `sec_ora_result` (
  `check_id` int(11) NOT NULL,
  `req_no` int(11) NOT NULL,
  `status` enum('OK','NOK','OPEN','NA') NOT NULL COMMENT 'OK, NOK, OPEN, N(ot)A(pplicable)',
  `reason` text,
  PRIMARY KEY (`check_id`,`req_no`)
)

编辑#2:请求的信息(示例和结果)

我调整了 sec_ora_result 中的列,以使其更容易(不需要其他表进行比较 - 只需两个表) 表 sec_ora_result:

check_id|req_no|status|reason|node_name|instance_oracle_sid|source
1|1|OPEN|Could not be tested automatically|abc|ora1|automatic_security_test
2|4|OK|Software Version is OK|abc|ora1|automatic_security_test
3|5|NOK|There is a Problem|abc|ora1|autotic_security_test

表 sec_ora_acceptance:

node_name|instance_oracle_sid|req_no|status|reason|acceptor|acceptor_mail|date|valid_until
abc|ora1|1|OK|Manual proof|Markus|markus@email.com|2014-02-20|9999-12-31

结果现在应包含以下内容

req_no|status|reason|source
1|OK|Manual proof|Markus
4|OK|Software Version is OK|automatic_security_test
5|NOK|There is a Problem|automatic_security_test

问候 马库斯

最佳答案

编辑: 据我了解,那么你需要这样的东西......

   SELECT SR.req_no, 
            ISNULL( SA.status, SR.status) as Status, 
            ISNULL( SA.reason, SR.reason) as Reason, 
            ISNULL( SA.acceptor,  SR.source) as Source
    FROM sec_ora_result SR 
    left join sec_ora_acceptance SA on SA.req_no = SR.req_no

请注意,我们可以使用 ISNULL,因为状态、原因和接受者都不为空,因此如果它们为 NULL,则意味着整行为 NULL,然后我们可以采用 SR 字段,但是,如果这些字段中的任何一个可能为空,那么你需要一个常规的 CASE WHEN SA.req_no 为 null then Field1 else Field2 end。

另外,看看用于左连接的键,不确定您是否仅通过 req_no 进行过滤,或者您还需要其他内容...

关于mysql - 用于显示临时状态的 SELECT 语句(两个表),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21910406/

相关文章:

sql - 我可以在OUTPUT子句中使用DISTINCT吗?

MySQL数据类型SET与rails

php - 如何简化sql查询

mysql - 在mysql中制作全局自动递增数字的最简单方法

mysql - SQL 日期填充

mysql - 在多列中查找值的范围

sql - 如何将文本数据类型从 PostgreSQL 数据库转换/转换为链接的 MS SQL Server?

sql - 案例优先级查询中的 PostgreSQL 问题

mysql - 按期间分组结果

java - 无法使用 IP 地址连接到 MySQL 服务器