Эффективно ВЫБЕРИТЕ реальную запись или виртуальную / стандартную «запись» в .NET / T- SQL - PullRequest
1 голос
/ 11 марта 2020

У меня есть структура для работы с данными из загруженного. NET Набор данных из одного запроса. У меня есть таблица, предназначенная для переопределения значений по умолчанию для моего приложения. Чтобы продемонстрировать построение таблицы переопределения параметров:

CREATE TABLE TABLE1(
    PK int IDENTITY(1,1) NOT NULL,
    VALINT int NOT NULL,
    DESCRIPTION1 varchar(50) NOT NULL
)

Мой код сгенерирует SQL со встроенными значениями по умолчанию, UNION, с данными пользовательских переопределений из таблицы, в запрос и вернет один набор данных:

SELECT C.VALINT, C.DESCRIPTION1
    FROM (
        SELECT MAX(PK)AS PK, VALINT
        FROM (
            SELECT PK, VALINT
            FROM TABLE1
            UNION
            SELECT 0, 1
            UNION
            SELECT 0, 2
        ) A
        GROUP BY VALINT
    )B, (
        SELECT PK, VALINT, DESCRIPTION1
        FROM TABLE1
        UNION
        SELECT 0, 1, 'Default1Val'
        UNION
        SELECT 0, 2, 'Default2Val'
    ) C
    WHERE B.PK = C.PK AND B.VALINT = C.VALINT

Запустите этот запрос для пустой таблицы, и вы увидите только две настройки по умолчанию, определенные в запросе. Затем можно добавить новое пользовательское переопределение:

INSERT INTO TABLE1(VALINT,DESCRIPTION1)VALUES(1,'CustomOverride1')

Теперь повторите этот запрос, и вы увидите одно пользовательское значение из таблицы и одно оставшееся не переопределенное значение по умолчанию. Этот запрос делает именно то, что мне нужно, однако, когда выполняется таким образом, данные из таблицы объединяются с данными настроек по умолчанию два раза. Возможен ли более элегантный запрос с одним набором UNION или я застрял с двумя полными наборами UNION, как показано выше?

Ответы [ 2 ]

1 голос
/ 11 марта 2020

Здесь очень полезно выражение Common Table ( CTE ).

Я также исправил ваше объединение - вместо этого не рекомендуется использовать разделенные запятыми объединения (объединения в старом стиле) используйте явный тип соединения.

declare @TABLE1 table (
    PK int IDENTITY(1,1) NOT NULL,
    VALINT int NOT NULL,
    DESCRIPTION1 varchar(50) NOT NULL
);

WITH cte AS (
    SELECT PK, VALINT, DESCRIPTION1
    FROM @TABLE1
    UNION
    SELECT 0, 1, 'Default1Val'
    UNION
    SELECT 0, 2, 'Default2Val'
)
SELECT C.VALINT, C.DESCRIPTION1
FROM (
    SELECT MAX(PK)AS PK, VALINT
    FROM cte A
    GROUP BY VALINT
) B
inner join cte C on B.PK = C.PK AND B.VALINT = C.VALINT;

Возвращает:

VALINT  DESCRIPTION1
1       Default1Val
2       Default2Val

Добавление пользовательского переопределения дает:

INSERT INTO @TABLE1 (VALINT,DESCRIPTION1) VALUES(1,'CustomOverride1');

WITH cte AS (
    SELECT PK, VALINT, DESCRIPTION1
    FROM @TABLE1
    UNION
    SELECT 0, 1, 'Default1Val'
    UNION
    SELECT 0, 2, 'Default2Val'
)
SELECT C.VALINT, C.DESCRIPTION1
FROM (
    SELECT MAX(PK)AS PK, VALINT
    FROM cte A
    GROUP BY VALINT
) B
inner join cte C on B.PK = C.PK AND B.VALINT = C.VALINT;

Возвращает:

VALINT  DESCRIPTION1
2       Default2Val
1       CustomOverride1
0 голосов
/ 11 марта 2020

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

При объединении двух таблиц к ним предъявляются следующие требования

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