У меня есть две таблицы. Первый называется TempIds, и он содержит только один столбец с именем Id, который имеет тип int

TempIds :

Id
45
34
77

Второй называется «Страны», в котором есть два столбца: «Идентификатор» и «Название страны»:

Id      Name
22      Austria
45      Germany
88      China
12      Japan

Я хочу выбрать все строки из таблицы стран, соответствующие идентификаторам в таблице TempIds. Но уловка в том, что если TempIds пуст, то запрос должен вернуть все строки из стран.

Пока это то, что я пытался:

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 пуст, то я должен получить все страны из таблицы стран.

Спасибо заранее

2
huber.duber 3 Мар 2018 в 09:36

3 ответа

Лучший ответ

Очень простой, но можно попробовать: ->

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

Пожалуйста, не возражайте против форматирования.

3
Jesús López 3 Мар 2018 в 07:42

выберите все строки из таблицы стран, соответствующие идентификаторам в таблице TempIds. Но уловка в том, что если TempIds пуст, то запрос должен вернуть все строки из стран.

Похоже, вы должны написать проверку условия 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
0
Nisarg 3 Мар 2018 в 06:46

Используйте оператор UNION с CROSS JOIN, чтобы получить все страны, если TempIds имеет значения null

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

0
Yogesh Sharma 3 Мар 2018 в 06:59