Я могу создать свойства с общедоступным методом get и частным методом set?

Сначала я бы изменил ваш запрос со старого, унаследованного синтаксиса JOIN на явное объединение, поскольку это облегчает понимание запроса:

SELECT
    DISTINCT

    Equipment_Reserved.Equipment_Attached_To,
    Equipment.Name
FROM
    Equipment
    INNER JOIN Equipment_Reserved ON Equipment_Reserved.Equipment_idEquipment = Equipment.idEquipment
    INNER JOIN Studies            ON Studies.idStudies = Equipment_Reserved.Studies_idStudies

WHERE
    Studies.Study = 'MAINT19-01'
    AND
    Equipment.Type = 'Probe'

Я не думаю, что вам действительно нужен [115 ] - Я думаю, что вы можете сделать это с помощью вложенного запроса с помощью функции ROW_NUMBER. Я видел, что PIVOT запросы часто имеют худшие планы выполнения запросов, чем вложенные запросы.

Давайте добавим ROW_NUMBER (для которого требуется ORDER BY как оконную функцию) и сопоставление ORDER BY во всем запросе, чтобы сделать его согласованным). Давайте также воспользуемся PARTITION BY, чтобы он сбрасывал номер строки для каждого значения Equipment_Attached_To:

SELECT
    DISTINCT
    Equipment_Reserved.Equipment_Attached_To,
    Equipment.Name,

    ROW_NUMBER() OVER (PARTITION BY Equipment_Attached_To ORDER BY [Name]) AS RowNumber

FROM
    Equipment
    INNER JOIN Equipment_Reserved ON Equipment_Reserved.Equipment_idEquipment = Equipment.idEquipment
    INNER JOIN Studies            ON Studies.idStudies = Equipment_Reserved.Studies_idStudies

WHERE
    Studies.Study = 'MAINT19-01'
    AND
    Equipment.Type = 'Probe'

ORDER BY
    Equipment_Attached_To,
    [Name]

Это даст следующий вывод:

Equipment_Attached_To   Name    RowNumber
2297                    R1-P1    1
2297                    R1-P2    2
2299                    R1-P3    1

Затем его можно разделить в явные столбцы, как это показано ниже. Использование MAX() является произвольным (мы могли бы использовать MIN() вместо этого) и только потому, что мы имеем дело с GROUP BY и потому что CASE WHEN... ограничивает входной набор только 1 строкой в ​​любом случае.

SELECT
    Equipment_Attached_To,
    MAX( CASE WHEN RowNumber = 1 THEN [Name] END ) AS Name1,
    MAX( CASE WHEN RowNumber = 2 THEN [Name] END ) AS Name2
FROM
    (
        -- the query from above
    )
GROUP BY
    Equipment_Attached_To
ORDER BY
    Equipment_Attached_To,
    Name1,
    Name2

Итак, последний запрос:

SELECT
    Equipment_Attached_To,
    MAX( CASE WHEN RowNumber = 1 THEN [Name] END ) AS Name1,
    MAX( CASE WHEN RowNumber = 2 THEN [Name] END ) AS Name2
FROM
    (
        SELECT
            DISTINCT
            Equipment_Reserved.Equipment_Attached_To,
            Equipment.Name,

            ROW_NUMBER() OVER (PARTITION BY Equipment_Attached_To ORDER BY [Name]) AS RowNumber

        FROM
            Equipment
            INNER JOIN Equipment_Reserved ON Equipment_Reserved.Equipment_idEquipment = Equipment.idEquipment
            INNER JOIN Studies            ON Studies.idStudies = Equipment_Reserved.Studies_idStudies

        WHERE
            Studies.Study = 'MAINT19-01'
            AND
            Equipment.Type = 'Probe'
    )
GROUP BY
    Equipment_Attached_To
ORDER BY
    Equipment_Attached_To,
    Name1,
    Name2
14
задан Mark Smith 5 May 2009 в 22:42
поделиться

2 ответа

Ваш подход верен, но переопределение @property bar в расширении класса должно соответствовать исходному объявлению, за исключением чтения-записи и чтения-чтения. Так что это будет работать:

Foo.h

@interface Foo {
  NSString *bar;
}
@property (copy,readonly) NSString *bar;
@end

Foo.m:

#import "Foo.h"

@interface Foo ()
@property (copy,readwrite) NSString *bar;
@end

@implementation Foo
@synthesize bar;
@end

(напомним, что по умолчанию установлено значение , присваивайте для свойств, а не , копируйте ).

31
ответ дан 1 December 2019 в 07:52
поделиться

When Barry says "the default is retain for properties" he means that retain should be specified like this:

@property (retain) NSDate *endDate;

If they are left like this:

@property NSDate *endDate;

assign is assumed by the compiler.

3
ответ дан 1 December 2019 в 07:52
поделиться