我有两个SELECT
语句。如果第一条语句不返回任何内容或NULL
,我想运行第二条SQL语句。
第一个Select
语句:
SELECT
k.key_no, concat(k.key_no,'-', key_title)
FROM
dbo.ff_keyword k
LEFT JOIN
ff_fundkey f ON f.key_no = k.key_no
LEFT JOIN
ff_fundinfo fi ON fi.fund_no = f.fund_no
WHERE
f.fund_no = '1'
ORDER BY
key_no, key_title
OFFSET 1 ROWS
FETCH NEXT 1 ROWS ONLY
第二条语句:
SELECT
k.key_no, concat(k.key_no,'-', key_title)
FROM
dbo.ff_keyword k
我尝试使用ISNULL
,但我认为这不是解决方案。无论如何,在SQL Server 2016中可以执行此操作吗?我不确定Case When
是否可以解决问题。
ISNULL代码:
SELECT
ISNULL((SELECT k.key_no, concat(k.key_no,'-', key_title)
FROM dbo.ff_keyword k
LEFT JOIN ff_fundkey f ON f.key_no = k.key_no
LEFT JOIN ff_fundinfo fi ON fi.fund_no = f.fund_no
WHERE f.fund_no = '1'
ORDER BY key_no, key_title
OFFSET 1 ROWS
FETCH NEXT 1 ROWS ONLY),
(SELECT k.key_no, concat(k.key_no,'-', key_title)
FROM dbo.ff_keyword k))
这是我使用ISNULL
时出现的错误:
第16层,状态1,第10行,Msg 116
如果未使用EXISTS引入子查询,则只能在选择列表中指定一个表达式。第16层,状态1,第12行,消息116
如果未使用EXISTS引入子查询,则只能在选择列表中指定一个表达式。
任何帮助将不胜感激:)
答案 0 :(得分:2)
一种方法是CTE:
with first as (
select k.key_no, concat(k.key_no, '-', key_title) as col
from dbo.ff_keyword k join
ff_fundkey f
on f.key_no = k.key_no left join
ff_fundinfo fi
on fi.fund_no = f.fund_no
where f.fund_no = '1'
order by key_no, key_title
offset 1 rows fetch next 1 rows only
)
select f.* --I think we can only select from first not other tables
from first f
union all
select k.key_no, concat(k.key_no, '-', key_title)
from dbo.ff_keyword k
where not exists (select 1 from first);
请注意,我将第一个left join
更改为内部联接。 where
子句仍然会这样做,因此left join
会产生误导。
答案 1 :(得分:1)
您可以将其设置为“ IF EXISTS”子句,如下所示:
IF EXISTS (
SELECT k.key_no, CONCAT (k.key_no, '-', key_title)
FROM dbo.ff_keyword k
LEFT JOIN ff_fundkey f ON f.key_no = k.key_no
LEFT JOIN ff_fundinfo fi ON fi.fund_no = f.fund_no
WHERE f.fund_no = '1'
ORDER BY key_no, key_title OFFSET 1 ROWS FETCH NEXT 1 ROWS ONLY
)
BEGIN
SELECT k.key_no, CONCAT (k.key_no, '-', key_title)
FROM dbo.ff_keyword k
LEFT JOIN ff_fundkey f ON f.key_no = k.key_no
LEFT JOIN ff_fundinfo fi ON fi.fund_no = f.fund_no
WHERE f.fund_no = '1'
ORDER BY key_no, key_title OFFSET 1 ROWS
FETCH NEXT 1 ROWS ONLY
END
ELSE
BEGIN
SELECT k.key_no, CONCAT (k.key_no, '-', key_title)
FROM dbo.ff_keyword k
END