2015-01-31 3 views
1

Я бы хотел, чтобы мой SQL-запрос возвращал строку, даже если в моем разделе IN нет соответствия строк.SQL: Я хочу, чтобы строка возвращалась с NULL, даже если нет совпадения с моим предложением IN.

Для Exemple этот запрос:

SELECT id, foo 
FROM table 
WHERE id IN (0, 1, 2, 3) 

вернется:

id|foo 
0|bar 
1|bar 
2|bar 
3|null 

Но вместо этого у меня есть (потому что ни одна строка с идентификатором 3):

id|foo 
0|bar 
1|bar 
2|bar 

я не смог чтобы найти этот трюк:

SELECT tmpTable.id, table.bar 
FROM (
    SELECT 0 as id 
    UNION SELECT 1 
    UNION SELECT 2 
    UNION SELECT 3 
) tmpTable 
LEFT JOIN 
( 
SELECT table.foo, table.id 
    FROM table 
    WHERE table.id IN (0, 1, 2, 3) 
) table 
on table.id = tmpTable.id 

Есть ли лучший способ?

Бонус: Как заставить его работать с переменной списка myBatis?

+1

К сожалению, ваш фокус в том, как хорошо, как он получает, по крайней мере в стандартном SQL. – dasblinkenlight

+2

Как определяются значения в вашей позиции «in»? Можно ли загружать все значения, которые вы хотите отобразить в своем результирующем наборе, в отдельную таблицу и присоединиться к этому? Это общий шаблон, похожий на таблицу «Даты», которая содержит запись за каждый день, которая может сделать возвращаемые данные сгруппированы в день cinch (и указать, когда нет данных за этот день). – overslacked

ответ

-1

Основная цель программирования минимален кода высокой производительности не нужно это вещи просто удалить идентификатор 3 из в разделе

-1

насчет просто говоря:

ВЫБРАТЬ идентификатор, Foo FROM таблицы WHERE ID> = 0 и < = 3

3

нерабочее право. Большинство разработчиков SQL используют вспомогательную таблицу, в которой хранятся целые числа (и та, которая хранит даты). Это описано во всей главе «SQL для Smarties» Джо Селко.

Пример:

CREATE TABLE numeri (numero INTEGER PRIMARY KEY) 

DECLARE @x INTEGER 
SET @x = 0 
WHILE @x < 1000 
BEGIN 
    INSERT INTO numeri (numero) VALUES (@x) 
    SET @x = @x + 1 
END 

SELECT 
    numero AS id, 
    foo 
FROM 
    numeri 
    LEFT OUTER JOIN my_table 
    ON my_table.id = numero 
WHERE 
    numero BETWEEN 0 AND 3 
Смежные вопросы