2015-10-09 2 views
1

У меня есть таблица, как показано ниже:Получить результат на основе значения атрибута столбца

Id Plan Attributes Value 
1  A  Name  AAA 
2  A  Class  P 
3  A  IsActive True 
4  B  Name  BBB 
5  B  Class  Q 
6  B  IsActive False 
7  C  Name  CCC 
8  C  Class  R 
9  C  IsActive True 

Я хочу, чтобы получить только те плана (со всеми их атрибутами), которые имеют значение их IsActive атрибута установлено значение True. Я не могу этого добиться.

Желаемый результат:

Id Plan Attributes Value 
    1  A  Name  AAA 
    2  A  Class  P 
    3  A  IsActive True 
    7  C  Name  CCC 
    8  C  Class  R 
    9  C  IsActive True 
+1

Что вы пробовали? – Arvo

ответ

1

Вы можете попробовать это:

EDIT:

select * from mytable 
where plan in (select plan from mytable 
    where Attributes = 'IsActive' and Value = 'True') 
+0

он вернет только строки, имеющие атрибут IsActive, а не атрибут Name и Class. Мне нужны все атрибуты для активных планов. – vivek

+0

@vivek: - Обновлен мой ответ. Пожалуйста, проверьте. Непонятно. –

+0

@vivek: - Также как раз на стороне примечания: ваш вопрос помечен в MS Access и SQL Server. Однако запрос будет работать и с базой данных, но вы должны избегать тегирования продуктов, которые вы не используете :) –

1

Попробуйте

select * 
from tbl 
where plan in (
    select plan from tbl 
    where Attributes = 'IsActive' and Value = 'True' 
) 
1

Это то, что вы «Ищет:

SELECT * 
FROM TABLE 
WHERE PLAN IN (
     SELECT DISTINCT PLAN 
     FROM TABLE 
     WHERE Attributes = 'IsActive' 
      AND Value = 'True'); 

Внутренний запрос идентифицируют те планы, которые имеют атрибуты к IsActive и значению равно True и внешний запрос выбирает все строки для тех соответствующих планов, которые были определены в подзапроса ,

0

Вы ищете для этого DEMO HERE

select * from @table_ 
where [plan] not in (select [plan] from @table_ where value ='False') 
+0

Почему 'Атрибуты = 'IsActive'' и' AND Attributes IN ( ' Name ' ,' Class ' ,' IsActive ' ) 'снова? И что, если OP имеет больше атрибутов, то тот, который указан? –

0

Прежде всего, эта таблица не нормируется.

Это должно быть так:

Id Plan Name Class IsActive 
1 A AAA P True 
2 B BBB Q False 
3 C CCC R True 

Запроса для ун-нормированных таблиц:

Select * 
From MyTable 
Where [Plan] In (
    Select [Plan] 
    From MyTable 
    Where Attributes = 'IsActive' And Value = 'True' 
) 

Примечания: Я написал [План] в квадратных скобках, потому что план является зарезервированным словом ,

+1

Не все таблицы ** имеют ** нормализуемые. –

+0

Да, но вся таблица ДОЛЖНА БЫТЬ нормализована :-) –

+2

Изменение схемы таблицы на то, что вы предложили, действительно ** только **, если в таблице не более трех различных атрибутов. Но что, если в этой таблице есть 1000 различных атрибутов? Мы не знаем, являются ли данные, представленные OP, фактическими данными или * выборочными данными * (что имеет значение только для этого примера и, скорее всего, не будет репрезентативным для реального мира и реальных данных, содержащихся в таблице). –

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