如果第一个SELECT返回0行,则另一个表中的第二个SELECT查询

时间:2019-11-20 09:54:14

标签: mysql mariadb

我已经读过这个question。但这是在同一张桌子上。我该如何在两三个表中进行归档:

if (SELECT ViewCode FROM M_VIEW
          WHERE ViewCode=?) //if found return
else (SELECT ViewCode FROM M_Customer
          WHERE CustomerCode=?)

3 个答案:

答案 0 :(得分:3)

您可以使用以下解决方案:

SELECT DISTINCT ViewCode FROM (
    SELECT ViewCode, 'M_VIEW' AS tName FROM M_VIEW WHERE ViewCode = 1
    UNION ALL
    SELECT ViewCode, 'M_Customer' FROM M_Customer WHERE ViewCode = 1
) t GROUP BY tName, ViewCode
HAVING tName = CASE 
    WHEN SUM(tName = 'M_VIEW') > 0 THEN 'M_VIEW' 
    WHEN SUM(tName = 'M_Customer') > 0 THEN 'M_Customer'
    ELSE '' 
END

demo on dbfiddle.uk

答案 1 :(得分:3)

这是另一种方法,它将从一个表中返回行:

SELECT ViewCode FROM M_VIEW WHERE ViewCode = @ViewCode
UNION ALL
SELECT ViewCode FROM M_Customer WHERE CustomerCode = @CustomerCode AND NOT EXISTS (
    SELECT 1 FROM M_VIEW WHERE ViewCode = @ViewCode
)

请注意,我已将?替换为变量名以显示哪个?意味着什么。

Demo on db<>fiddle

答案 2 :(得分:2)

假设每个查询应返回0或1行,则可以使用union all,然后对记录和限制进行排序,如下所示:

SELECT ViewCode
FROM (
    SELECT ViewCode, 1 seq FROM M_View WHERE ViewCode = ?
    UNION ALL SELECT ViewCode, 2 FROM M_Customer WHERE CustomerCode = ?
) t
ORDER BY seq
LIMIT 1

如果第一个查询(来自M_View)返回一条记录,则排序子句将其放在第一位,而limit 1则消除可能的其他记录。否则,将选择(唯一的)匹配记录(来自M_Customer)。