2011-02-04 4 views
1

Я немного потерял здесь ...SQL Sub-select как поле?

У меня есть несколько таблиц, которые я хотел бы, чтобы вытащить единую запись из: Unit, Building, Owner и Picture.

Вот мой запрос до сих пор:

SELECT building.`Street_Address` 
    , building.`Building_Name` 
    , building.`Building_Type` 
    , CONCAT(building.`Cross_Street_1`, ' & ', building.`Cross_Street_2`) Cross_Streets 
    , building.`Cross_Street_1` 
    , building.`Cross_Street_2` 
    , building.`Access` Building_Access 
    , owner.`Company_Name` 
    , owner.`Contact_Or_Reference` 
    , owner.`Landlord_Phone` 
    , picture.`Path_To_Picture_On_Server` 
    , picture.`Picture_Category` 
    , unit.`Apartment_Number` 
    , unit.`Unit_Size_Number` Size 
    , unit.`Is_Doorman` 
    , unit.`Is_Furnished` 
    , unit.`Is_Elevator` 
    , unit.`Is_Pets` 
    , unit.`Is_OutdoorSpace` 
    , unit.`Rent_Price` 
    , unit.`Baths` 
    , unit.`Access` Unit_Access 
    , unit.`fourd_id` 
    , unit.`Updated_Date` 
    , unit.`Occupancy_Date` 
    , unit.`Term` 
    , unit.`Incentives` 
    , unit.`Info_OutdoorSpace` 
    , unit.`List_Date` 
    , zone.`Description` 
FROM 4D_Units unit 
JOIN 4D_Building building 
    ON unit.`BUILDING_RecID` = building.`fourd_id` 
JOIN 4D_Zones zone 
    ON building.`ZONES_RecID` = zone.`fourd_id` 
LEFT JOIN 4D_Owners owner 
    ON unit.`OWNER_RecID` = owner.`fourd_id` 
LEFT JOIN 4D_Building_Picts picture 
    ON (building.`fourd_id` = picture.`BUILDING_RecID` AND picture.`Picture_Category` = 'Front') 
WHERE unit.`id` = 49901 

Это прекрасно работает как есть, за исключением того, что возвращение запись будет только когда есть картина «Front» в записи (если он присутствует). Моя проблема заключается в том, что существует несколько различных типов фотографий, которые могут быть связаны с возвратной записью, включая «Панорама», «Интерьер» и «План этажей» ... все разные возможные значения для picture.Picture_Category.

Есть ли способ вернуть эти значения (если они присутствуют, как указано выше) в возвращаемом наборе без отдельного запроса? Я хочу, чтобы возвращаемый набор включал (если присутствует) псевдонимы для всех четырех возможных вариантов picture.Picture_Category: «Фронт», «Панорама», «Интерьер», & «План этажей» (с их собственным уникальным picture.Path_To_Picture_On_Server, связанным с ним).

Это имеет смысл?

ответ

1

Если я вас правильно понял, вы хотите иметь 4 набора столбцов изображения в результирующем наборе - один из досягаемости 4 категории ? Прямо сейчас у вас есть только один для фронта, не так ли?

Вы можете присоединиться к одной и той же таблице несколько раз с различными псевдонимами и различными предложениями о присоединении. Просто присоединитесь к 4D_Building_Picts 4 раза, один раз для каждого изображения, которое вы хотите.

select 
    --whatever 
    , pic_front.`Path_To_Picture_On_Server` AS Front_Path_To_Picture_On_Server 
    , pic_panorama.`Path_To_Picture_On_Server` AS Panorama_Path_To_Picture_On_Server 
    , pic_interior.`Path_To_Picture_On_Server` AS Interior_Path_To_Picture_On_Server 
    , pic_floorplan.`Path_To_Picture_On_Server` AS Floorplan_Path_To_Picture_On_Server 
    --whatever 
FROM 4D_Units unit 
JOIN 4D_Building building 
    ON unit.`BUILDING_RecID` = building.`fourd_id` 
JOIN 4D_Zones zone 
    ON building.`ZONES_RecID` = zone.`fourd_id` 
LEFT JOIN 4D_Owners owner 
    ON unit.`OWNER_RecID` = owner.`fourd_id` 
LEFT JOIN 4D_Building_Picts pic_front 
    ON (building.`fourd_id` = pic_front.`BUILDING_RecID` AND pic_front.`Picture_Category` = 'Front') 
LEFT JOIN 4D_Building_Picts pic_panorama 
    ON (building.`fourd_id` = pic_panorama.`BUILDING_RecID` AND pic_panorama.`Picture_Category` = 'Panorama') 
LEFT JOIN 4D_Building_Picts pic_interior 
    ON (building.`fourd_id` = pic_interior.`BUILDING_RecID` AND pic_interior.`Picture_Category` = 'Interior') 
LEFT JOIN 4D_Building_Picts pic_floorplan 
    ON (building.`fourd_id` = pic_floorplan.`BUILDING_RecID` AND pic_floorplan.`Picture_Category` = 'Floorplan') 
WHERE unit.`id` = 49901 
+0

Yup! То, что я искал ... однако, я возвращаю 4 идентичных записи вместо 1, если все 4 присутствуют ... Должен ли я просто «LIMIT 1», или есть ли что-то другое, что нужно сделать вместо этого? – neezer

+0

Я забыл изменить предложения ON, чтобы ссылаться на каждую подтаблицу, поэтому она дублировала. Проблема заключалась в том, что у меня был 'building.fourd_id = picture.BUILDING_RecID', но он должен был быть' = pic_front.BUILDING_RecID' и так далее. Версия теперь должна делать только один раз - взгляните и дайте мне знать. – chmullig

0

Я думаю, что вам нужна функция coalesce. Он принимает несколько полей и возвращает первый из них, который не является нулевым. Так что-то вроде:

Select 
    Coalesce(A.Panorama, A.Interior, A.Floorplan, '') as ImagePath 
From 
    Table A 

Вы только в конечном итоге с одним значением таким образом, хотя, что не может быть на самом деле то, что вы после этого. Если вы хотите, чтобы все из них я предлагаю использовать связанные подзапросы, например, так:

Select 
    (Select P.Path_To_Picture From 4D_Building_Picts P where P.Building_RecID = B.fourd_Id And P.Picture_Category = 'Front') as Front_Pic, 
    (Select P.Path_To_Picture From 4D_Building_Picts P where P.Building_RecID = B.fourd_Id And P.Picture_Category = 'Panorama') as Panamora_Pic, 
    (Select P.Path_To_Picture From 4D_Building_Picts P where P.Building_RecID = B.fourd_Id And P.Picture_Category = 'FloorPlan') as FloorPlan_Pic, 
    ... 
From 
    4D_Building B 
+0

Да, я хочу несколько значений для каждой возможной опции. Любые другие идеи? – neezer

+0

@neezer - Я обновил мой, чтобы включить другой вариант. Он использует коррелированные подзапросы для извлечения путей изображения - вы можете получить все пути в виде отдельных столбцов, но при этом получить только одну запись для каждого здания. Я думаю, это может соответствовать вашим потребностям. –

+0

Спасибо за обновление. У меня нет никакой информации об эффективности здесь, так что это только для моего назидания: есть ли какая-либо производительность, использующая вложенные SELECT вместо JOIN? – neezer

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