2017-01-13 4 views
1

SQL 쿼리를 실행하여 여러 객실의 점유자를 확인하고 싶습니다. 빈 객실도보고 싶습니다.SQL IN 절 - 일치하지 않는 IN 요소를 다시 얻으십시오.

나는 형태의 SQL 사용하여 탑승자를 찾을 수 있습니다 만 방 1과 2는 거주자가있는 경우, 그러나

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

를, 예를 들어

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

여기 테이블 디자인이 좋지 않습니다. Rooms 테이블에는 점유자가 있는지 여부에 관계없이 모든 테이블이 포함되어야합니다! – 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에서 실제 테이블을 작성할 수 있습니다. 여기

데모 :

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") 

또는 단지 그들을 필터링 : 탑승자가없는 객실을 가정

SQLFiddle

0

이 NULL로 설정, 당신은 case 문을 사용할 수 있습니다 where 절 :

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

두 개의 별도 테이블이 있어야합니다. 하나는 방의 목록으로, 두 번째는 기존 표에 추가하면 LEFT join experession으로 선택할 수 있습니다.

Room 

Room 1 

Room 2 

Room 3 

Room 4 

Room 5 

Room 6 

Room 7 

를 다음 쿼리와 같이 될 것입니다 :

예를 들어 RoomsList 테이블 등이 될 것입니다

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 원하는 출력을 얻을하는 데 도움이 될 것입니다. 당신은 거의 솔루션에 근처에 당신이 주어진 대답에서 볼 수있는 여러 가지 방법이 있습니다하지만 난 당신이 다음과 같이 약간의 변화를 귀하의 코드를 수행하는 것이 좋습니다 : MYSQL를 들어

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

동일한 방식으로 IFNULL을 사용할 수 있습니다