Привет Всем!
с вот такой задачкой. Есть номера(гостиничные), в них находятся некоторое оборудование.
Вся эта беда находится в 2х таблицах:Tools (ToolID, ToolName, Price) и Equipment (RoomID и ToolID)
SELECT tools.toolid, tools.toolname, equipment.roomid
FROM tools LEFT OUTER JOIN equipment ON tools.equipmentid = equipment.equipmentid
WHERE roomid = %roomid
C *=:
SELECT tools.toolid, tools.toolname, equipment.roomid
FROM tools, equipment
WHERE tools.equipmentid *= equipment.equipmentid
AND roomid = %roomid
Здравствуйте, SBoyko, Вы писали:
SB>Необходимо сформировать запрос с результатом вида (для номера 103)
SB>1 Кондиционер 103 SB>2 Компьютер SB>3 Телевизор SB>4 Магнитофон 103 SB>5 Вентилятор
SB>Вопросы: SB>1. можно ли сформировать такой запрос. SB>2. его примерный вид в SQL SB>3. Вообще делает ли кто нибудь так???? )))
SELECT t.ID, t.Name, e.RoomID, IFNULL(e.RoomID, -1) FROM
Tools t LEFT OUTER JOIN Equipment e ON t.ID = e.ToolID
WHERE e.RoomID = 103
в тех комнатах, где нет какой-то тулы будет -1. или можно сделать NULL или пустую строку все зависит от того какой тип тебе нужен.
Здравствуйте, Анатолий Широков, Вы писали:
SB>>у меня поля equipmentid нету
АШ>Да, конечно, ON tools.toolid = equipment.toolid.
SB>>Заменил на toolid — не работает
АШ>Не работает под чем?
Access 2002, не выдает поля с NULL значениями комнат
Здравствуйте, Анатолий Широков, Вы писали:
SB>>2. его примерный вид в SQL АШ>С JOIN: АШ>
АШ>SELECT tools.toolid, tools.toolname, equipment.roomid
АШ>FROM tools LEFT OUTER JOIN equipment ON tools.equipmentid = equipment.equipmentid
АШ>WHERE roomid = %roomid
АШ>
Не надо спешить. Как автор вопроса ни пытался скрыть от всех нас что ему надо, я догадался что хочен он следующее: надо вывести все записи из таблицы tools, и если данная тулза имеется в номере 103, то ставить флажок(единичку например), а если нет то NULL. Ваш же запрос делает более очевидную вещь — выводит список оборудования в номере.
Здравствуйте, yogi, Вы писали:
Y>Не надо спешить. Как автор вопроса ни пытался скрыть от всех нас что ему надо, я догадался что хочен он следующее: надо вывести все записи из таблицы tools, и если данная тулза имеется в номере 103, то ставить флажок(единичку например), а если нет то NULL. Ваш же запрос делает более очевидную вещь — выводит список оборудования в номере.
Да, чистая правда. Необходимо заполнять Enable в CheckBox'ax если тулза есть в комнате Можно конечно читать всю таблицу Тулз, рисовать CheckBox'сы, а затем сформировать запрос на выборку тулз по комнате, но... захотелось все сразу одним махом
Здравствуйте, yogi, Вы писали:
Y>Здравствуйте, Анатолий Широков, Вы писали:
SB>>>2. его примерный вид в SQL АШ>>С JOIN: АШ>>
АШ>>SELECT tools.toolid, tools.toolname, equipment.roomid
АШ>>FROM tools LEFT OUTER JOIN equipment ON tools.equipmentid = equipment.equipmentid
АШ>>WHERE roomid = %roomid
АШ>>
Y>Не надо спешить. Как автор вопроса ни пытался скрыть от всех нас что ему надо, я догадался что хочен он следующее: надо вывести все записи из таблицы tools, и если данная тулза имеется в номере 103, то ставить флажок(единичку например), а если нет то NULL. Ваш же запрос делает более очевидную вещь — выводит список оборудования в номере.
Не надо спешить. Мой запрос выводит список всего оборудования (tools) c пометкой имеется ли данное оборудование в номере %roomid или нет. Только вместо ваших единичек ставиться идентификатор комнаты.
АШ>Не надо спешить. Мой запрос выводит список всего оборудования (tools) c пометкой имеется ли данное оборудование в номере %roomid или нет. Только вместо ваших единичек ставиться идентификатор комнаты.
Именно это мне и нужно, но результата нет. Может дело в Access'e?
Здравствуйте, Анатолий Широков, Вы писали:
SB>>>>2. его примерный вид в SQL АШ>>>С JOIN: АШ>>>
АШ>>>SELECT tools.toolid, tools.toolname, equipment.roomid
АШ>>>FROM tools LEFT OUTER JOIN equipment ON tools.equipmentid = equipment.equipmentid
АШ>>>WHERE roomid = %roomid
АШ>>>
АШ>Не надо спешить. Мой запрос выводит список всего оборудования (tools) c пометкой имеется ли данное оборудование в номере %roomid или нет. Только вместо ваших единичек ставиться идентификатор комнаты.
Мда? А вот если например в номере нет какого-то айтема с номером 7, то после лефтджоина вы получите строку вида (7,'Название мега-айтема',NULL), а потом эта строка будет отфильтрована условием roomid = %roomid — ведь номер комнаты NULL.
Здравствуйте, SBoyko, Вы писали:
SB>Да, чистая правда. Необходимо заполнять Enable в CheckBox'ax если тулза есть в комнате Можно конечно читать всю таблицу Тулз, рисовать CheckBox'сы, а затем сформировать запрос на выборку тулз по комнате, но... захотелось все сразу одним махом
Тебе неплохо бы запустить что-то вида (по вкусу поправишь)
select a.toolname "Наименование",
(select count(*)
from equipment
where roomid=103 and toolid=a.toolid) "Количество"
from tools a
Здравствуйте, yogi, Вы писали:
Y>Здравствуйте, SBoyko, Вы писали:
SB>>Мужики, ну я не знаю что и делать, аксес не хавает это, я уже пробовал и так
Y>Ну не хавает и фиг с ним. Он же Аксесс Сделаешь два запроса: Y>
Y>SELECT * FROM Tools; --нарисуешь табличку
Y>SELECT * FROM Equipment WHERE RoomID=103; --расставишь галочки
Y>
ВСЕ ! ЗА...МУЧИЛСЯ, весь день убил на это, а придется делать по рабоче-крестьянски.
Здравствуйте, SBoyko, Вы писали:
SB>Привет Всем!
skip..
SB>Необходимо сформировать запрос с результатом вида (для номера 103) SB>1 Кондиционер 103 SB>2 Компьютер SB>3 Телевизор SB>4 Магнитофон 103 SB>5 Вентилятор
SB>Вопросы: SB>1. можно ли сформировать такой запрос.
можно в любой СУБД SB>2. его примерный вид в SQL
SELECT Tools.ToolID, Tools.ToolName, Equipment.RoomID
FROM Tools, Equipment
WHERE Tools.ToolID = Equipment.ToolID
AND Equipment.RoomID=103
UNION
SELECT T1.ToolID, T1.ToolName,('сюда NULL или что угодно') AS RoomID
FROM Tools AS T1
WHERE T1.ToolID NOT IN (SELECT T2.ToolID
FROM Tools AS T2, Equipment
WHERE T2.ToolID = Equipment.ToolID
AND Equipment.RoomID=103 )
ORDER BY Tools.ToolID;
SB>3. Вообще делает ли кто нибудь так???? )))
не знаю..
Здравствуйте, БуМарат, Вы писали:
БМ>SELECT Tools.ToolID, Tools.ToolName, Equipment.RoomID БМ>FROM Tools, Equipment БМ>WHERE Tools.ToolID = Equipment.ToolID БМ>AND Equipment.RoomID=103 БМ>UNION БМ>SELECT T1.ToolID, T1.ToolName,('сюда NULL или что угодно') AS RoomID БМ>FROM Tools AS T1 БМ>WHERE T1.ToolID NOT IN (SELECT T2.ToolID БМ> FROM Tools AS T2, Equipment БМ> WHERE T2.ToolID = Equipment.ToolID БМ> AND Equipment.RoomID=103 ) БМ>ORDER BY Tools.ToolID;
SB>Необходимо сформировать запрос с результатом вида (для номера 103)
SB>1 Кондиционер 103 SB>2 Компьютер SB>3 Телевизор SB>4 Магнитофон 103 SB>5 Вентилятор
SB>Вопросы: SB>1. можно ли сформировать такой запрос. SB>2. его примерный вид в SQL SB>3. Вообще делает ли кто нибудь так???? )))
Попробуй перекрестный запрос:
TRANSFORM Count(ID) AS C_ID
SELECT tools.ToolID, ToolName
FROM [SELECT Equipment.*, tools.*
FROM Equipment INNER JOIN tools ON Equipment.ToolID = tools.ToolID]. AS [temp]
GROUP BY tools.ToolID, ToolName
PIVOT RoomID;
и по всем номерам и количество оборудования (вдруг в одном номере два телевизора
Здравствуйте, ААз, Вы писали:
ААз>Попробуй перекрестный запрос:
ААз>TRANSFORM Count(ID) AS C_ID ААз>SELECT tools.ToolID, ToolName ААз>FROM [SELECT Equipment.*, tools.* ААз>FROM Equipment INNER JOIN tools ON Equipment.ToolID = tools.ToolID]. AS [temp] ААз>GROUP BY tools.ToolID, ToolName ААз>PIVOT RoomID;
А не трудно ли будет потом работать в программе с наименованиями столбцов из записей таблицы? (Конечно, наверное, можно запрос модифицировать нужным образом)
ААз> ААз>и по всем номерам и количество оборудования (вдруг в одном номере два телевизора
IMHO нельзя так организовывать данные, чтобы количество телевизоров определять таким образом. Должно быть соответствующее поле : Equipment (ID,RoomID,ToolID,количество)
Здравствуйте, БуМарат, Вы писали:
БМ>А не трудно ли будет потом работать в программе с наименованиями столбцов из записей таблицы? (Конечно, наверное, можно запрос модифицировать нужным образом)
нет не трудно. можно ограничить внутренний запрос Where RoomID=103 и получишь только для 103 номера. и работай только с полем "103"
БМ>IMHO нельзя так организовывать данные, чтобы количество телевизоров определять таким образом. Должно быть соответствующее поле : Equipment (ID,RoomID,ToolID,количество)
по сути таблица Equipment — опись оборудования с указанием места расположения и вида оборудования, таблица Tools- вид оборудования. Каждая запись таблицы Equipment может содержать данные присущие только этому объекту: дата ввода, откуда пришло, кто принял и пр. и потому их складывать нельзя.