Вы можете использовать myadzel Patternizer jQuery плагин для достижения этого эффекта в браузерах.
Вы используете Patternizer, добавляя class="background-clip"
к HTML-элементам, где вы хотите, чтобы текст был нарисован как шаблон изображения, и укажите изображение в дополнительном атрибуте data-pattern="…"
. См. Источник демонстрации . Patternizer создаст изображение SVG с заполненным шаблоном текстом и подпишет его прозрачно отображаемому HTML-элементу.
Если, как и в примере с образцом вопроса, шаблон заполнения текста должен быть частью фонового изображения, расширяющегося за пределами «узорного» элемента, я вижу два варианта (непроверенный, мой любимый первый):
Путем объединения двух таблиц и фильтрации:
select distinct t1.id from t1 inner join t2
on t2.t1id = t1.id
where
(t2.category in ('Veggie','Fruits') and t2.date_distributed is null)
or
(t2.category not in ('Veggie','Fruits'));
В таблице t2 не ясно, как называется столбец, содержащий идентификатор из t1, поэтому я использовал t2.t1id
Вы можете использовать логику Not Exists
с помощью multiplication
двух слагаемых:
decode(Category,'Veggie',1,'Fruits',1,0)
- это Zero
, т. Е. Not Veggie/Fruits
или
nvl2(Date_Distributed,1,0)
является Zero
( ноль ), то есть Not Distributed
with T2( T2_ID, Category, Date_Distributed, T1_ID ) as
(
select '01','Veggie', date'2018-01-01', 1 from dual union all
select '02','Fruits', date'2018-01-03', 1 from dual union all
select '03','Veggie', null , 2 from dual union all
select '04','Nuts' , date'2018-01-05', 2 from dual union all
select '05','Fruits', null , 3 from dual union all
select '06','Seeds' , date'2018-01-10', 3 from dual union all
select '07','Veggie', null , 4 from dual union all
select '08','Veggie', date'2018-01-11', 5 from dual union all
select '09','Veggie', null , 5 from dual union all
select '10','Fruit' , date'2018-01-12', 5 from dual union all
select '11','Fruit' , null , 5 from dual union all
select '12','Nuts' , date'2018-01-15', 6 from dual union all
select '13','Seeds' , date'2018-01-22', 6 from dual union all
select '14','Nuts' , null , 7 from dual
)
select T1_ID
from T2
group by T1_ID
having sum(decode(Category,'Veggie',1,'Fruits',1,0)*nvl2(Date_Distributed,1,0))=0
order by T1_ID;
T1_ID
-----
2
3
4
6
7
Между прочим, нет необходимости объединяться с T1
. Если вы хотите использовать таблицу T1
, строку from T2
можно заменить на from T1 join T2 on T1.ID = T2.T1_ID
.
Rextester Demo kbd>
На самом деле вы хотите ID
с, для которых не существует распределены вегетарианские или фруктовые.
Таким образом, вы используете NOT EXISTS
и в подзапросе вы рассматриваете только записи в категориях с date_distributed is NOT null
select *
from t1
where NOT exists (select null
from t2
where t2.t1id = t1.id and
t2.category in ('Veggie','Fruits') and
t2.date_distributed is NOT null
);
ID
----------
2
3
4
6
7
Если я правильно следую логике, на ум приходит exists
:
select *
from t1
where exists (select 1
from t2
where t2.id = t1.id and
t2.category in ('Veggie','Fruits') and
t2.date_distributed is null
) or
not exists (select 1
from t2
where t2.id = t1.id and
t2.category in ('Veggie','Fruits')
) ;
РЕДАКТИРОВАТЬ:
Я неправильно прочитал данные из-за первоначального форматирования вопроса. Для вашего вопроса я буду следовать тому же подходу:
select *
from t1
where not exists (select 1
from t2
where t2.t1_id = t1.id and
t2.category in ('Veggie','Fruits') and
t2.date_distributed is not null
) ;
Вы, кажется, хотите t1.id
, где они не находятся в указанных категориях с датой распространения.