2012-06-26 3 views
0

Привет, ребята, у меня есть эта таблица структурыОтмена выбора в данных с различным значением столбца

field 1     field 2 
--------------------------------------------- 
    1      1 
    1      2 
    2      1 

Тогда я хочу, чтобы это было так, при выборе ключа Field2 = 1

field 1     field 2 
--------------------------------------------- 
    2       1 

Я не хочу для возврата field1 = 1 потому что он содержит разные значения field1 IN (1,2)

Спасибо вам большое.

+0

'SELECT field_1, field_2 FROM table WHERE field_2 = 1 AND field_1! = 1' –

ответ

0
SELECT * FROM table WHERE field_2 = 1 AND field_1 <> 1 
1

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

Выберите строки из таблицы, где field2 содержит одинаковые значения для того же field1.

Если вам нужно только для вывода field1 и field2, вы можете сделать следующее:

SELECT field1, MAX(field2) AS field2 
FROM atable 
GROUP BY field1 
HAVING COUNT(DISTINCT field2) = 1 

Вы можете опустить DISTINCT если таблица не может содержать повторяющиеся пары из (field1, field2).

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

SELECT t.* /* or specify the necessary columns explicitly */ 
FROM atable AS t 
    INNER JOIN (
    SELECT field1 
    FROM atable 
    GROUP BY field1 
    HAVING COUNT(DISTINCT field2) = 1 
) s ON t.field1 = s.field1 

Опять же, DISTINCT могут быть опущены, как объяснено выше.

Поскольку вы используете SQL Server 2008, вы также можете использовать агрегирование окон. Если таблица не содержит дубликатов из (field1, field2), вы можете использовать следующее:

; 
WITH counted AS (
    SELECT 
    *, 
    cnt = COUNT(*) OVER (PARTITION BY field1) 
    FROM atable 
) 
SELECT 
    field1, 
    field2, 
    … 
FROM counted 
WHERE cnt = 1 

Но если дубликаты будут разрешены, вы должны будете использовать несколько иной подход, потому что нет оконного аналог для COUNT(DISTINCT …). Вот то, что вы могли бы попробовать:

; 
WITH counted AS (
    SELECT 
    *, 
    f2min = MIN(field2) OVER (PARTITION BY field1), 
    f2max = MAX(field2) OVER (PARTITION BY field1) 
    FROM atable 
) 
SELECT 
    field1, 
    field2, 
    … 
FROM minmaxed 
WHERE f2min = f2max 

То есть, вы получаете минимальное и максимальное значение field2 для каждого field1 значения. Затем вы отфильтровываете строки, где f2min - это не то же самое, что и f2max, потому что это означает, что в группе есть разные значения field2.

Смежные вопросы