Sql Query, связывающий две таблицы - PullRequest
0 голосов
/ 16 декабря 2008

Одно сомнение в MSSQL. В базе данных есть две таблицы.

Таблица 1 с именем Property содержит поля PRPT_Id (int), PRPT_Name (varchar), PRPT_Status (бит)

Таблица 2 с именем PropertyImages содержит поля PIMG_Id (int), PIMG_ImageName (varchar), PRPT_Id (int), PIMG_Status (бит)

Эти две таблицы следуют соотношению один-ко-многим. Это означает, что каждому свойству может соответствовать ноль, один или несколько PropertyImages, соответствующих ему.

Требуется запрос для отображения

PRPT_Id, PRPT_Name, ImageCount (Количество всех изображений, соответствующих PRPT_Id, где PIMG_Status равно true. O если изображений нет), FirstImageName (если n изображений, то имя первого изображения в таблице изображений соответствует PRPT_Id с PIMG_Status true. если изображений нет, мы заполняем их пробелом / пробелом). другое условие - PRPT_Status должно быть истинным.

Редактировать примечание - в обеих таблицах в качестве первичного ключа используются целые числа с автоинкрементом Итак, первым именем изображения будет имя с MIN (PIMG_Id), не правда ли?

Я хочу, чтобы PIMG_ImageName соответствовало MIN (PIMG_ID) в наборе результатов

Ответы [ 3 ]

2 голосов
/ 16 декабря 2008

Если предположить, что FirstImage означает тот, у которого самый низкий Id, то это должно быть как минимум достаточно близко, чтобы проверить до завершения:

SELECT
PRPT_Id,
PRPT_Name
ISNULL (pi1.ImageName, '') AS FirstImageName,
COUNT (1) AS ImageCount

ОТ Собственности AS p

LEFT JOIN PropertyImages AS pi
ON p.PRPT_Id = pi.PRPT_Id

LEFT JOIN PropertyImage AS pi1
ON p.PRPT_Id = pi1.PRPT_Id

LEFT JOIN PropertyImgage AS pi2
ON p.PRPT_Id = pi2.PRPT_Id
AND pi1.PIMG_Id> pi2.PIMG_Id

ГДЕ PRPT_Status = ИСТИНА
AND pi1.PIMG_Status = TRUE
AND pi2.PIMG_ImageName IS NULL

Двойной LEFT JOIN гарантирует, что вы получите первую запись изображения в pi1. Если «Первое» правило отличается, измените это объединение соответствующим образом.

Это должно быть максимально эффективно. У него нет подзапросов.

2 голосов
/ 16 декабря 2008

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

Если это так (я не эксперт по SQL), я бы порекомендовал вам начать с самого внутреннего запроса, затем вы выходите из него, пока не достигнете самого внешнего (и последнего) запроса.

Сначала вы должны извлечь PIMG и сгруппировать их по PRPT.

SELECT PRPT_Id, COUNT(PIMG_Id) AS PRPT_ImageCount, MIN(PIMG_Id) AS PRPT_MinImage
FROM PropertyImages
GROUP BY PRPT_Id

Получает PRPT_Id свойств, с которыми связаны изображения. Однако вы не получите никаких результатов для свойств, которые не имеют связанных изображений.

После этого мы оставим объединение таблицы свойств с предыдущим запросом. Левое объединение гарантирует, что все свойства будут получены, даже если они не отображаются в результатах правильного запроса (то есть, даже если у них нет связанных изображений).

SELECT Properties.*, PRPT_ImageCount, PRPT_MinImage
FROM Properties LEFT JOIN (
SELECT PRPT_Id, COUNT(PIMG_Id) AS PRPT_ImageCount, MIN(PIMG_Id) AS PRPT_MinImage
FROM PropertyImages
GROUP BY PRPT_Id ) Temp ON ( Properties.PRPT_Id = Temp.PRPT_Id )

Я надеюсь, что мой SQL не ошибается и что этот пост поможет вам.

С уважением,


Edit:

SELECT Properties.*,
       PRPT_ImageCount,
       PRPT_MinImage,
       PIMG_ImageName
FROM ( Properties LEFT JOIN
       ( SELECT PRPT_Id,
                COUNT(PIMG_Id) AS PRPT_ImageCount,
                MIN(PIMG_Id) AS PRPT_MinImage
         FROM PropertyImages
         GROUP BY PRPT_Id ) Temp1
       ON ( Properties.PRPT_Id = Temp1.PRPT_Id ) ) Temp2 LEFT JOIN
     PropertyImages ON ( PropertyImages.PIMG_Id = Temp2.PRPT_MinImage )

Теперь я действительно не уверен в своем SQL.

0 голосов
/ 16 декабря 2008

имя первого изображения в таблице изображений, соответствующее PRPT_Id с PIMG_Status true

Вы можете определить «первый» в этом контексте. Таблицы на самом деле не упорядочены, поэтому, если вы не сохраните свой порядок, сначала термин должен означать «первый найден».

Если предположить, что вышеприведенное верно (вы хотите сначала найти изображение), то это единственная действительно сложная часть запроса (и тот тип вещей, который меня раньше вызывал) Остальное кажется довольно прямым. Если я смогу найти время завтра, я постараюсь собрать кое-что для вас ... но, вероятно, кто-то другой сможет дать ответ до этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...