Мне нужно понять следующую инструкцию MS SQL (SELECT FROM VALUES) - PullRequest
3 голосов
/ 14 июня 2019

Я довольно новичок в MS SQL, но мне приходится много работать с ним сейчас.Мне нужно понять, что здесь происходит:

    BEGIN TRANSACTION loadHalfdayAbsences;
    INSERT INTO @halfDayAbsences
    ([AbsencePart], 
     [AbsenceId], 
     [DeleteDate], 
     [LastChangeDate]
    )
           SELECT CASE ap.AbsencePart
                      WHEN 1
                      THEN a.AbsenceStart
                      WHEN 3
                      THEN a.AbsenceEnd
                      ELSE CASE
                               WHEN a.AbsenceStartHalfDay = 1
                               THEN DATEADD(DAY, 1, a.AbsenceStart)
                               ELSE a.AbsenceStart
                           END
                  END AS newEnd,
                  CASE ap.AbsencePart
                      WHEN 1
                      THEN 0.50
                      WHEN 2
                      THEN 1.00
                      WHEN 3
                      THEN 0.50
                  END AS newDuration, 
                  [ap].[AbsencePart], 
                  [a].[AbsenceId], 
                  [a].[EmployeeId], 
           FROM
           (
               SELECT AbsencePart
               FROM(VALUES(1), (2), (3)) AS t(AbsencePart)
           ) AS ap
           INNER JOIN dwh.Absence AS a ON 1 = 1
           WHERE AbsenceType IN
           (
               SELECT AbsenceType
               FROM @AbsenceType4TimeTac
           )

В частности:

           FROM
           (
               SELECT AbsencePart
               FROM(VALUES(1), (2), (3)) AS t(AbsencePart)
           ) AS ap
           INNER JOIN dwh.Absence AS a ON 1 = 1
           WHERE AbsenceType IN
           (
               SELECT AbsenceType
               FROM @AbsenceType4TimeTac
           )
  • Что делает эта часть?
  • Что делают ЗНАЧЕНИЯздесь для меня?
  • Что происходит с данными?
  • Выбирается ли он, но только поля, в которых есть 1, 2 или 3?Или что происходит с VALUES?

Спасибо за любой вклад заранее :)

Ответы [ 2 ]

4 голосов
/ 14 июня 2019

порция

FROM (VALUES(1), (2), (3)) AS t(AbsencePart)

- это просто встроенная таблица, состоящая из трех значений, от 1 до 3, в столбце с именем AbsensePart. Вы могли бы также использовать следующий синтаксис:

FROM
(
    SELECT 1 AS AbsencePart UNION ALL
    SELECT 2 UNION ALL
    SELECT 3
) t
1 голос
/ 14 июня 2019

Это называется конструктором табличных значений.Он используется вместо таких вещей, как временные таблицы, когда у вас есть список известных значений, которые вы хотите в таблице.Вы можете прочитать больше о них здесь .

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