2017-01-13 13 views
1

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

я могу найти водителя и пассажиров с помощью SQL формы:

SELECT Room, OccupantName 
FROM Rooms 
WHERE Rooms IN ("Room 1", "Room 2", "Room 3", "Room 4") 

Однако, если только Номера 1 и 2 имеют пассажиров, например

Room OccupantName 
Room 1, Person A 
Room 2, Person B 

, как я могу получить что-то в виде:

Room OccupantName 
Room 1, Person A 
Room 2, Person B 
Room 3, Nobody 
Room 4, Nobody 

Есть ли способ выбрать элементы раздела IN, которые не возвращают результаты и показывают «Никто»?

+0

Попробуйте использовать условие IFNULL, можете ли вы сообщить нам, какая таблица хранит имя пользователя? –

+0

Вопрос будет, что на самом деле находится в ваших таблицах при запросе? –

+0

У вас плохой дизайн стола здесь. В таблице «Комнаты» должны быть указаны все таблицы - независимо от того, есть ли у них жильцы или нет! – jarlh

ответ

2

Похоже, что ваша таблица Rooms содержит только данные для активных занятий. Это имеет смысл во многих отношениях, потому что вы не хотите хранить информацию о людях, которые на самом деле не занимают комнату. Но задача состоит в том, чтобы создать желаемый набор результатов, потому что недостающие комнаты отсутствуют в Rooms.

Один из вариантов - это подход «календарной таблицы». Вы можете LEFT JOIN таблицу, содержащую все номера, к вашему текущему столу Rooms, а затем отметьте недостающие места как nobody.

SELECT t1.Room, 
     COALESCE(t2.OccupantName, 'Nobody') AS OccupantName 
FROM 
(
    SELECT "Room 1" AS Room 
    UNION ALL 
    SELECT "Room 2" 
    UNION ALL 
    SELECT "Room 3" 
    UNION ALL 
    SELECT "Room 4" 
) AS t1 
LEFT JOIN Rooms AS t2 
    ON t1.Room = t2.Rooms 

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

Демо здесь:

SQLFiddle

0

Предполагая, что номера без пассажира установлены в NULL, вы могли бы использовать случай заявление:

SELECT Room, CASE WHEN OccupantName IS NULL THEN 'Nobody' Else OccupantName END 
FROM Rooms 
WHERE Room IN ("Room 1", "Room 2", "Room 3", "Room 4") 

Или просто фильтровать их с где пункт:

SELECT Room, OccupantName 
FROM Rooms 
WHERE Room IN ("Room 1", "Room 2", "Room 3", "Room 4") 
    AND OccupantName IS NOT NULL 
1

У вас должны быть две отдельные таблицы. один со списком комнат и второй по существующим таблицам, то вы можете выбрать ЛЕВЫЙ опыт вступать в силу.

, например, таблица RoomsList будет как:

Room 

Room 1 

Room 2 

Room 3 

Room 4 

Room 5 

Room 6 

Room 7 

, а затем запрос будет как:

SELECT Room, OccupantName 

FROM RoomsList Left Join Rooms 

ON RoomsList.Room=Rooms.Room 

WHERE RoomsList.Room IN ("Room 1", "Room 2", "Room 3", "Room 4") 
0

Только один COALESCE или ISNULL поможет вам получить желаемый результат. Вы почти рядом с вашим решением, и есть много способов, как вы можете видеть в данных ответов, но я предлагаю вам сделать небольшое изменение кода, как показано ниже:

SELECT Room, COALESCE(OccupantName, 'Nobody') AS OccupantName 
FROM Rooms 
WHERE Rooms IN ('Room 1', 'Room 2', 'Room 3', 'Room 4') 

Для MYSQL вы можете использовать IFNULL таким же образом,

 Смежные вопросы

  • Нет связанных вопросов^_^