我需要这个查询从REPORT表返回两个值,SUBJECT和ID_NUM。
Subject正常选择,但ID_NUM只有在表IMS中SECRET设置为N时才应该选择。
我通常会做
join on REPORT.ID_NUM = IMS.IR_ID_NUM
但是在SELECT语句中,我不确定在我指定WHERE表之前如何在SELECT部分中做到这一点。
SELECT SUBJECT,
--Check if secret before selecting values
--Secret column is in IMS table, value i want selected is in REPORT
CASE
WHEN (SECRET = 'N') THEN ID_NUM
ELSE 'SECRET' END
AS 'ID_NUM ',
FROM REPORT
INNER JOIN IMS ON ID_NUM = IR_ID_NUM
INNER JOIN IR_SUBJECT ON IR_ID_NUM = SUB_ID_NUM
SQL语句的不同子句(逻辑上)按一定的顺序执行:
SELECT ... // 5.
FROM ... // 1.
JOIN ... ON ...
WHERE ... // 2.
GROUP BY ... // 3.
HAVING ... // 4.
ORDER BY ... // 6.
按顺序取:
- 所有记录选择
FROM
表,适用任何连接ON
条件,并以逗号(,
)分隔交叉连接表。 - 根据
WHERE
条款过滤记录。 - 记录为
GROUP
'ed。 - 分组值根据
HAVING
子句进行过滤。 - 结果值为
SELECT
'd,FROM
子句中所有表的列都可用,包括JOIN
表。 - 结果行是
ORDER
'ed的,您甚至可以通过计算结果值订购。
因此,SELECT
子句中的CASE
表达式可以毫无问题地访问SECRET
和ID_NUM
。
注意:当给定多个表时,建议始终限定列名。如果列名有歧义(多个表有相同名称的列),则需要这样做,但即使对于没有歧义的列名,也应该这样做,作为稍后阅读SQL语句的其他人(和您自己)的文档。