SQL Server 2016 Получение отчетливых результатов, только если оно ограничено оператором where - PullRequest
0 голосов
/ 04 июня 2018

Я ищу отдельный список поля CUSTOMER_NAME из моей таблицы.Обычно я просто делал бы

SELECT 

      distinct 
         [CUSTOMER_NAME]

  FROM [iData3].[dbo].[N241650]

или

SELECT 

         [CUSTOMER_NAME]

  FROM [iData3].[dbo].[N241650]

Group by [CUSTOMER_NAME]

Но я ограничен в своем запросе.Из-за ограничений программного обеспечения запрос может быть только в форме

SELECT * from 
[iData3].[dbo].[N241650] 
where ...

Как получить отдельный список имен клиентов с учетом этих ограничений?По сути, мне нужно втиснуть все в предложение WHERE.Я думаю, возможно, ГДЕ СУЩЕСТВУЕТ или НЕ СУЩЕСТВУЕТ, но я раньше не использовал эти условия, поэтому я не уверен, будут ли они полезны.

Это невозможно, потому что ... приемлемо, если неутешительный ответ.

Ответы [ 4 ]

0 голосов
/ 04 июня 2018

Если вы не можете убежать от *, тогда вы не можете GROUP BY, и если у вас просто есть WHERE, тогда вам понадобится ключ (уникальный набор столбцов), чтобы можно было правильно фильтроватьили вы не можете различать дубликаты (и в итоге выбираете более 1 строки с одним и тем же именем клиента).

Это немного запутанно, но попробуйте это.Он будет получать по 1 строке на каждую CUSTOMER_NAME.

SELECT 
    * 
from 
    [iData3].[dbo].[N241650] 
where 
    [N241650].KeyColumn IN
    (
        SELECT
            Z.KeyColumn
        FROM
            (
                SELECT
                    X.KeyColumn,
                    Ranking = ROW_NUMBER() OVER (PARTITION BY X.CUSTOMER_NAME ORDER BY X.KeyColumn ASC)
                FROM
                    [iData3].[dbo].[N241650] AS X
                WHERE
                    X.KeyColumn IS NOT NULL
            ) AS Z
        WHERE
            Z.Ranking = 1
    )

ORDER BY внутри OVER будет определять, какую строку вы получите для каждой CUSTOMER_NAME.

Если выиметь несколько столбцов для вашего ключа, тогда вам придется переключить IN для EXISTS для нескольких столбцов (вы не можете сделать несколько столбцов IN в SQL Server).

SELECT 
    * 
from 
    [iData3].[dbo].[N241650] 
where
    EXISTS (
        SELECT
            'key columns match'
        FROM (
            SELECT
                X.KeyColumn1,
                X.KeyColumn2,
                Ranking = ROW_NUMBER() OVER (PARTITION BY X.CUSTOMER_NAME ORDER BY X.KeyColumn1 ASC)
            FROM
                [iData3].[dbo].[N241650] AS X
            ) AS Z
        WHERE
            Z.Ranking = 1 AND
            [N241650].KeyColumn1 = Z.KeyColumn1 AND
            [N241650].KeyColumn2 = Z.KeyColumn2
    )
0 голосов
/ 04 июня 2018

Вы можете использовать функцию row_number():

SELECT TOP (1) WITH TIES [CUSTOMER_NAME]
FROM [iData3].[dbo].[N241650]
ORDER BY ROW_NUMBER() OVER (PARTITION BY CUSTOMER_NAME ORDER BY ?)

? обозначает что-то идентификатор или основной / уникальный столбец, который у вас есть.

0 голосов
/ 04 июня 2018

Вы можете группировать по этому столбцу для достижения того же результата.

select CUSTOMER_NAME 
from ...
group by CUSTOMER_NAME
order by CUSTOMER_NAME;

Другой альтернативой является использование хранимой процедуры.

0 голосов
/ 04 июня 2018

Вам нужно что-то уникальное в каждом ряду.Если у вас это есть, вы можете использовать:

SELECT CUSTOMER_NAME
FROM [iData3].[dbo].[N241650]
WHERE pk = (SELECT MIN(n2.pk)
            FROM [iData3].[dbo].[N241650] n2
            WHERE n2.CUSTOMER_NAME = N241650.N241650
           );

pk - уникальный столбец.

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