Как я могу оптимизировать запрос, чтобы получить значения на основе каждого идентификатора?

Я видел, как это делалось двумя способами.

  1. Выбросить исключение внутри init.
  2. Вернуть объект, возвращаемый init, вашим одиночным объектом.

Чтобы быть ясными, не делайте этого. Это необязательно и сделает ваши синглеты чрезмерно трудными для тестирования и подкласса.

edit, чтобы добавить примеры

Выбросить исключение в init

- (instancetype)init {
    [self doesNotRecognizeSelector:_cmd];
    return nil;
}

- (instancetype)initPrivate {
    self = [super init];
    if (self) {
    }
    return self;
}

+ (instancetype)sharedInstance {
    static MySingleton *sharedInstance;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[self alloc] initPrivate];
    });
    return sharedInstance;
}

Вернуть init ваш синглтон

- (instancetype)init {
    return [[self class] sharedInstance];
}

- (instancetype)initPrivate {
    self = [super init];
    if (self) {
    }
    return self;
}

+ (instancetype)sharedInstance {
    static MySingleton2 *sharedInstance;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[self alloc] initPrivate];
    });
    return sharedInstance;
}
2
задан garbage00 18 January 2019 в 08:43
поделиться

2 ответа

Попробуйте запрос ниже.

SELECT
  i.*,
  (SELECT
    f.Price
  FROM #TableB f
  WHERE i.ID_1 = f.PriceID)
  AS NewPrice1,
  (SELECT
    f1.Price
  FROM #TableB f1
  WHERE i.ID_2 = f1.PriceID)
  AS NewPrice2,
  (SELECT
    f2.Price
  FROM #TableB f2
  WHERE i.ID_3 = f2.PriceID)
  AS NewPrice3,
  (SELECT
    f3.Price
  FROM #TableB f3
  WHERE i.ID_4 = f3.PriceID)
  AS NewPrice4,
  (SELECT
    f4.Price
  FROM #TableB f4
  WHERE i.ID_5 = f4.PriceID)
  AS NewPrice5,
  (SELECT
    f5.Price
  FROM #TableB f5
  WHERE i.ID_6 = f5.PriceID)
  AS NewPrice6
FROM #TableA i
0
ответ дан Nandu 18 January 2019 в 08:43
поделиться

Под другим углом, чтобы посмотреть на это:

DECLARE @A TABLE
(
    Price INT,
    ID_1 INT,
    ID_2 INT,
    ID_3 INT
)
INSERT INTO @A
(
    Price,
    ID_1,
    ID_2,
    ID_3
)
VALUES
(129.90, 1, 1, 1),
(199.90, 2, 1, 1),
(249.90, 3, 2, 1),
(299.90, 4, 4, 3),
(399.90, 6, 5, 4)


DECLARE @B TABLE
(
    Price INT,
    PriceID INT
)
INSERT INTO @B
(
    Price,
    PriceID
)
VALUES
(129.90, 1),  
(149.90, 2),  
(199.90, 3),   
(249.90, 4),  
(299.90, 5),   
(399.90, 6)

SELECT
    a.Price,
    SUM(b.NewPrice1),
    SUM(b.NewPrice2),
    SUM(b.NewPrice3)
FROM @A a
CROSS APPLY
(
    SELECT
        CASE WHEN PriceID = a.ID_1 THEN Price ELSE NULL END AS  NewPrice1,
        CASE WHEN PriceID = a.ID_2 THEN Price ELSE NULL END AS  NewPrice2,
        CASE WHEN PriceID = a.ID_3 THEN Price ELSE NULL END AS  NewPrice3
    FROM @B
) b
GROUP BY a.Price
0
ответ дан Samir 18 January 2019 в 08:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: