我有两张桌子。 首先称为TempIds,它只包含一个名为Id的列,其类型为int
TempIds:
Id
45
34
77
第二个叫做国家,有两列,Id和Name 国家:
Id Name
22 Austria
45 Germany
88 China
12 Japan
我想要的是从Country表中选择与TempIds表中的Ids匹配的所有行。但问题是,如果TempIds为空,则查询应返回来自Countries的所有行。
到目前为止,这是我尝试过的:
select *
from Countries c
left join TempIds t on c.Id = t.Id or t.Id is null
select *
from Countries c
left join TempIds t on c.Id = t.Id
where (c.Id = t.Id or t.Id is null)
上述两个查询都不会返回正确的记录。我的问题是,如何编写一个返回正确结果的查询。也就是说,根据目前的TempIds表,我应该只得到德国。但是如果TempIds是空的,那么我应该从Countries表中获取所有国家。
谢谢是提前
答案 0 :(得分:2)
非常基本但可以尝试: - >
SELECT c.*
FROM
countries c LEFT OUTER JOIN tempids t
ON c.id = t.id
WHERE
t.id is not null
OR NOT EXISTS (SELECT 1 FROM tempids)
另一种选择: - >
WITH CTE as
(
SELECT
c.id, c.name, t.id as t_id
FROM
countries c LEFT OUTER JOIN tempids t
on c.id = t.id
)
SELECT *
FROM CTE
WHERE
t.id is not null
OR NOT EXIST (
SELECT 1
FROM cte
WHERE t_id is not null
)
或者非常简单,首先检查一下tempid的表计数然后决定查询: - >
IF exists(select 1 from tempid)
BEGIN
SELECT c.*
FROM
countries c INNER JOIN tempids t
ON c.id = t.id
END
ELSE
BEGIN
SELECT * from countries
END
请不要介意格式化。
答案 1 :(得分:0)
从Countries表中选择与TempIds表中的Ids匹配的所有行。但问题是,如果TempIds为空,则查询应返回来自Countries的所有行。
听起来你应该编写IF条件来检查场景,并根据它运行适当的查询。
类似的东西,
IF EXISTS (SELECT 1 FROM TempIds t INNER JOIN Countries c ON c.ID = t.ID)
BEGIN
-- TempIDs has at least one record that maps to countries.
SELECT c.*
FROM TempIds t
INNER JOIN Countries c
ON c.ID = t.ID
END
ELSE
BEGIN
SELECT *
FROM Countries
END
答案 2 :(得分:0)
如果TempIds null 值
,请使用UNION
运算符与CROSS JOIN
获取所有国家/地区
SELECT c.id, c.name FROM Countries c
LEFT JOIN TempIds t on c.id = t.id
UNION
SELECT t.id, c.name FROM TempIds t, Countries c
WHERE t.id IS NULL