Выберите данные, идентификатор которых существует в другой таблице в SQL - PullRequest
1 голос
/ 02 апреля 2012

У меня 2 таблицы, пусть говорит первая таблица с именем «Расписание» и вторая с именем «Настройка».

ТАБЛИЦА «РАСПИСАНИЕ»

 ID    Name    StartTime    EndTime     Room  
---------------------------------------------
 111   AAAA    08:00        09:00       -
 112   BBBB    08:00        09:00       -
 113   CCCC    08:00        09:00       -
 114   DDDD    08:30        09:30       -
 115   EEEE    08:30        09:30       -   
 116   FFFF    08:30        09:30       -      

ТАБЛИЦА «НАСТРОЙКА»

 ID    Type    Room  
------------------------
 111     1     BPD01  
 112     2     BPR33  
 113     2     BPR33  
 114     2     BPR35  
 115     2     BPR33  

Я хочу получить результат как:

 Room    StartTime  EndTime  Total Used   
---------------------------------------
 BPR33   08:00      09:00    2           
 BPR33   08:30      09:30    1           
 BPR35   08:30      09:30    1               

У меня есть такой код:

SELECT ST.Room, S.StartTime, S.EndTime, COUNT(*) AS [Total Used]
FROM Schedule AS S CROSS JOIN Setting AS ST
WHERE (ID IN
  (SELECT ID FROM Setting
   WHERE (Type = '2')))
GROUP BY ST.Room, S.StartTime, S.EndTime

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

Как это сделать?

Ответы [ 3 ]

3 голосов
/ 02 апреля 2012

Я вижу несколько потенциальных проблем здесь:

  • Ваш WHERE ID IN (SELECT ID FROM Setting WHERE Type='2') выглядит так, как будто это может быть WHERE Type='2'
  • Какой тип данных у вас Type столбец? Если это INT, сделайте WHERE Type = 2 вместо WHERE Type = '2' (который вы использовали бы, если бы Type был VARCHAR).
  • У вас, похоже, нет условия JOIN, связывающего ваши две таблицы (например, WHERE S.ID = ST.ID)

Все вместе сейчас:

SELECT ST.Room, S.StartTime, S.EndTime, COUNT(*) AS [Total Used]
FROM Schedule AS S CROSS JOIN Setting AS ST
WHERE S.ID = ST.ID 
AND Type = 2
GROUP BY ST.Room, S.StartTime, S.EndTime
2 голосов
/ 02 апреля 2012
SELECT ST.Room, S.StartTime, S.EndTime, COUNT(1) AS [Total Used]
FROM Setting AS ST
LEFT JOIN Schedule AS S 
ON S.ID = ST.ID
WHERE ST.Type = '2'
GROUP BY ST.Room, S.StartTime, S.EndTime

Здесь показаны те, которые не были запланированы с нулевым счетом. Если вы не хотите, чтобы объединение изменилось на:

SELECT ST.Room, S.StartTime, S.EndTime, COUNT(1) AS [Total Used]
FROM Setting AS ST
JOIN Schedule AS S 
ON S.ID = ST.ID
WHERE ST.Type = '2'
GROUP BY ST.Room, S.StartTime, S.EndTime
0 голосов
/ 02 апреля 2012
 SELECT ST.Room,Type AS [Total Used]
    FROM Schedule AS S CROSS JOIN Setting AS ST
    WHERE (ID IN
      (SELECT ID FROM Setting
       WHERE (Type = '2')))
    GROUP BY ST.Room
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...