Сначала я бы изменил ваш запрос со старого, унаследованного синтаксиса 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
Ваш подход верен, но переопределение @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
(напомним, что по умолчанию установлено значение , присваивайте
для свойств, а не , копируйте
).
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.