Ну и как?sp123 wrote: ↑09 Sep 2021 22:31Тут сразу же напрашивается классический вопрос для интервью - как удалить дубликаты одним sql стейтментомKinDzaDza wrote: В реальной же жизни как правило стоит прямо противоположная задача - с какого перепуга у нас тут появляются дубликаты и как их убрать. Но задачка для интервью неплохая.
Sent from my iPhone using Tapatalk Pro
Зачем появляются новые языки программирования? Сколько их и каких на самом деле нужно?
-
- Уже с Приветом
- Posts: 15185
- Joined: 30 Apr 2003 16:43
Re: Зачем появляются новые языки программирования? Сколько их и каких на самом деле нужно?
-
- Уже с Приветом
- Posts: 742
- Joined: 08 Apr 2021 01:54
Re: Зачем появляются новые языки программирования? Сколько их и каких на самом деле нужно?
Никому не интересно проверять что Вы( или кто-то другой) не знаете. Тем более вы уже все показали рассказами про то, как в AWS требуются недели чтобы создать VM с Linux/Oracle. Ну и про то, что не знали что instance можно stop/start в любой момент.
Даже на интервью имеет смысл разгоаривать с человеком только про то, что знает, а не про то, что он не знает.
-
- Уже с Приветом
- Posts: 15185
- Joined: 30 Apr 2003 16:43
-
- Уже с Приветом
- Posts: 742
- Joined: 08 Apr 2021 01:54
-
- Уже с Приветом
- Posts: 1961
- Joined: 24 Feb 2001 10:01
- Location: Челябинск -> Everett, WA
Re: Зачем появляются новые языки программирования? Сколько их и каких на самом деле нужно?
zVlad wrote: ↑10 Sep 2021 22:38Ну и как?sp123 wrote: ↑09 Sep 2021 22:31Тут сразу же напрашивается классический вопрос для интервью - как удалить дубликаты одним sql стейтментомKinDzaDza wrote: В реальной же жизни как правило стоит прямо противоположная задача - с какого перепуга у нас тут появляются дубликаты и как их убрать. Но задачка для интервью неплохая.
Sent from my iPhone using Tapatalk Pro
create table my_table (fld1 varchar(10));
insert into my_table (fld1) values ('aaa'), ('aaa'), ('bbb'), ('aaa'), ('bbb'), ('ccc');
delete from my_table a where ctid > (select min(ctid) from my_table b where a.fld1 = b.fld1);
Это ситаксис Postgres. Для Oracle все то же самое, только вместо CTID использовать ROWID. Какой аналог внутренненго уникального идентификатора записи в DB2 я не в курсе, но можно поиграться с row_number() over ().
-
- Уже с Приветом
- Posts: 15185
- Joined: 30 Apr 2003 16:43
Re: Зачем появляются новые языки программирования? Сколько их и каких на самом деле нужно?
Насколько я понимаю в Вашем примере будут удалены все записи в таблице начиная с некоторогo минимального значения CTID (+1) найденного в подзапросе. Это могут быть не только строки с a.fld1 = b.fld1 Проверьти сами. Я добавил, кмк, недостающий предикат в Ваш код выше.sp123 wrote: ↑11 Sep 2021 02:10zVlad wrote: ↑10 Sep 2021 22:38Ну и как?sp123 wrote: ↑09 Sep 2021 22:31Тут сразу же напрашивается классический вопрос для интервью - как удалить дубликаты одним sql стейтментомKinDzaDza wrote: В реальной же жизни как правило стоит прямо противоположная задача - с какого перепуга у нас тут появляются дубликаты и как их убрать. Но задачка для интервью неплохая.
Sent from my iPhone using Tapatalk Pro
create table my_table (fld1 varchar(10));
insert into my_table (fld1) values ('aaa'), ('aaa'), ('bbb'), ('aaa'), ('bbb'), ('ccc');
delete from my_table a where ctid > (select min(ctid) from my_table b where a.fld1 = b.fld1) and ctid in (select ctid from my_table b where a.fld1 = b.fld1);
Это ситаксис Postgres. Для Oracle все то же самое, только вместо CTID использовать ROWID. Какой аналог внутренненго уникального идентификатора записи в DB2 я не в курсе, но можно поиграться с row_number() over ().
В DB2 тоже есть тип данных ROWID. Физический Идентификатор строки существовал всегда, с самого начала, но в нем нужды для программистов не было никакой. Тем более что что в теории реляционных баз данных таблицы содержат физически неупорядоченый набор строк. Тип данных ROWID появился сравнительно недавно (см. ниже из reference) .
Вообще проблема дубликатов не такая тривиальная как Вы ее представили здесь. В Вашем случае с таблицей с одной колонкой все просто и понятно. Понятно и просто если мы говорим об уникальности в смысле значений всех столбцов таблицы. Но более распространенно что уникальность определяется по поднабору столбцов (ключу). И вот у Вас имеется строки с дублирирующими значениями в ключе и разными значениями в других столбцах. Ваши действия?
ROWID
For a row ID type.
A table can have only one ROWID column. The values in a ROWID
column are unique for every row in the table and cannot be updated. You
must specify NOT NULL with ROWID
Last edited by zVlad on 12 Sep 2021 00:09, edited 1 time in total.
-
- Уже с Приветом
- Posts: 1961
- Joined: 24 Feb 2001 10:01
- Location: Челябинск -> Everett, WA
Re: Зачем появляются новые языки программирования? Сколько их и каких на самом деле нужно?
create table my_table (fld1 int, fld2 varchar(10), txt varchar(100));
select * from my_table;
fld1 fld2 txt
1 aaa whatever1
1 aaa whatever2
1 aaa whatever3
1 bbb whatever4
1 bbb whatever5
1 ccc whatever6
Хотим сделать уникальный ключ fld1 + fld2:
delete from my_table a where ctid > (select min(ctid) from my_table b where a.fld1 = b.fld1 and a.fld2 = b.fld2);
select * from my_table;
fld1 fld2 txt
1 aaa whatever1
1 bbb whatever4
1 ccc whatever6
select * from my_table;
fld1 fld2 txt
1 aaa whatever1
1 aaa whatever2
1 aaa whatever3
1 bbb whatever4
1 bbb whatever5
1 ccc whatever6
Хотим сделать уникальный ключ fld1 + fld2:
delete from my_table a where ctid > (select min(ctid) from my_table b where a.fld1 = b.fld1 and a.fld2 = b.fld2);
select * from my_table;
fld1 fld2 txt
1 aaa whatever1
1 bbb whatever4
1 ccc whatever6
-
- Уже с Приветом
- Posts: 15185
- Joined: 30 Apr 2003 16:43
Re: Зачем появляются новые языки программирования? Сколько их и каких на самом деле нужно?
Вы не внимательно читали мой текст. А если поле текст make sense? Например мы хочем оставить строку с wharever2? Тогда Ваш вариант решения makes no sense. Согласны?sp123 wrote: ↑11 Sep 2021 16:51 create table my_table (fld1 int, fld2 varchar(10), txt varchar(100));
select * from my_table;
fld1 fld2 txt
1 aaa whatever1
1 aaa whatever2
1 aaa whatever3
1 bbb whatever4
1 bbb whatever5
1 ccc whatever6
Хотим сделать уникальный ключ fld1 + fld2:
delete from my_table a where ctid > (select min(ctid) from my_table b where a.fld1 = b.fld1 and a.fld2 = b.fld2);
select * from my_table;
fld1 fld2 txt
1 aaa whatever1
1 bbb whatever4
1 ccc whatever6
-
- Уже с Приветом
- Posts: 1961
- Joined: 24 Feb 2001 10:01
- Location: Челябинск -> Everett, WA
Re: Зачем появляются новые языки программирования? Сколько их и каких на самом деле нужно?
Текст читал внимательно, про критерии отсева записей там ничего не было, поэтому и оставил по каждому ключу первую попавшуюся запись для простоты.
Тогда давайте придумаем какой-нибудь удобоваримый критерий. Допустим, если по ключу попался наш любимый 'whatever2', то выбираем его. Если таких строк по ключу больше одной, то выбираем последнюю 'whatever2' по дате поступления в таблицу (заведем в таблице еще одну колонку created_date). Если 'whatever2' по ключу вообще нет, то выбираем просто последнюю запись по дате. Does make sense?
fld1 fld2 txt created_date
1 aaa whatever1 2021-01-04
1 aaa whatever2 2021-01-02
1 aaa whatever2 2021-01-03
1 aaa whatever3 2021-01-01
1 bbb whatever4 2021-01-01
1 bbb whatever5 2021-01-04
1 ccc whatever6 2021-01-01
Для подобного функционала лучше подходит способ # 2, про который я мельком упомянул выше:
delete from my_table where ctid in
(
select ctid
from (select t.ctid,
row_number() over (partition by fld1, fld2 order by case when txt = 'whatever2' then 0 else 1 end, created_date desc) as rank
from my_table t) tt
where tt.rank > 1
);
Результат:
fld1 fld2 txt created_date
1 aaa whatever2 2021-01-03
1 bbb whatever5 2021-01-04
1 ccc whatever6 2021-01-01
Задачка по сложности где-то между easy и intermediate.
-
- Уже с Приветом
- Posts: 15185
- Joined: 30 Apr 2003 16:43
Re: Зачем появляются новые языки программирования? Сколько их и каких на самом деле нужно?
Оставим пока про whatever2 в стороне.sp123 wrote: ↑11 Sep 2021 22:13Текст читал внимательно, про критерии отсева записей там ничего не было, поэтому и оставил по каждому ключу первую попавшуюся запись для простоты.
Тогда давайте придумаем какой-нибудь удобоваримый критерий. Допустим, если по ключу попался наш любимый 'whatever2', то выбираем его. Если таких строк по ключу больше одной, то выбираем последнюю 'whatever2' по дате поступления в таблицу (заведем в таблице еще одну колонку created_date). Если 'whatever2' по ключу вообще нет, то выбираем просто последнюю запись по дате. Does make sense?
fld1 fld2 txt created_date
1 aaa whatever1 2021-01-04
1 aaa whatever2 2021-01-02
1 aaa whatever2 2021-01-03
1 aaa whatever3 2021-01-01
1 bbb whatever4 2021-01-01
1 bbb whatever5 2021-01-04
1 ccc whatever6 2021-01-01
Для подобного функционала лучше подходит способ # 2, про который я мельком упомянул выше:
delete from my_table where ctid in
(
select ctid
from (select t.ctid,
row_number() over (partition by fld1, fld2 order by case when txt = 'whatever2' then 0 else 1 end, created_date desc) as rank
from my_table t) tt
where tt.rank > 1
);
Результат:
fld1 fld2 txt created_date
1 aaa whatever2 2021-01-03
1 bbb whatever5 2021-01-04
1 ccc whatever6 2021-01-01
Задачка по сложности где-то между easy и intermediate.
И давайте Вы все таки еще раз и внимательно прочитаете мой текст на Ваш первый пример и наконец, хотя бы, обратите внимание на то что я добавил к Вашшму "delete" и выделил подчеркиваниeм, жирным и large шрифтом.
Давайте?
-
- Уже с Приветом
- Posts: 1961
- Joined: 24 Feb 2001 10:01
- Location: Челябинск -> Everett, WA
Re: Зачем появляются новые языки программирования? Сколько их и каких на самом деле нужно?
Добавленное условие "and ctid in (select ctid from my_table b where a.fld1 = b.fld1)" излишне и на результат не влияет.
Если есть желание поразмышлять дальше на эту тему, то можно, к примеру, глянуть вот на эту ветку, там этого добра много: https://stackoverflow.com/questions/529 ... -in-oracle
Указанный пример там тоже есть. Да, там Oracle, но подходы и варианты годятся для остальных баз.
-
- Уже с Приветом
- Posts: 15185
- Joined: 30 Apr 2003 16:43
Re: Зачем появляются новые языки программирования? Сколько их и каких на самом деле нужно?
-
- Уже с Приветом
- Posts: 8230
- Joined: 06 Feb 2002 10:01
- Location: NJ, USA
Re: Зачем появляются новые языки программирования? Сколько их и каких на самом деле нужно?
Дорогие друзья, задача "удалить дубликаты из таблицы" практически никогда не встречается. Это задача для интервью письками померяться кто изрощрённей метод придумает.
Любой ДБА вам скажет, что лучше сохранить старую таблицу и сделать новую без дубликатов как Вам хочется. А то мало ли что Вы там наудаляете в продакшене. У Вас будет возможность проверить новую табличку что все получилось как надо, а бэкап уже потом как-нибудь удалим, через месяц-два.
Любой ДБА вам скажет, что лучше сохранить старую таблицу и сделать новую без дубликатов как Вам хочется. А то мало ли что Вы там наудаляете в продакшене. У Вас будет возможность проверить новую табличку что все получилось как надо, а бэкап уже потом как-нибудь удалим, через месяц-два.
-
- Уже с Приветом
- Posts: 15185
- Joined: 30 Apr 2003 16:43
Re: Зачем появляются новые языки программирования? Сколько их и каких на самом деле нужно?
Красиво поешь. А когда в базе данных полторы тысячи таблиц?Uzito wrote: ↑12 Sep 2021 01:37 Дорогие друзья, задача "удалить дубликаты из таблицы" практически никогда не встречается. Это задача для интервью письками померяться кто изрощрённей метод придумает.
Любой ДБА вам скажет, что лучше сохранить старую таблицу и сделать новую без дубликатов как Вам хочется. А то мало ли что Вы там наудаляете в продакшене. У Вас будет возможность проверить новую табличку что все получилось как надо, а бэкап уже потом как-нибудь удалим, через месяц-два.
-
- Уже с Приветом
- Posts: 8230
- Joined: 06 Feb 2002 10:01
- Location: NJ, USA
Re: Зачем появляются новые языки программирования? Сколько их и каких на самом деле нужно?
Вопрос из серии "напугал ежа голой жопой". У меня 1800+ таблиц только в одном приложении. В другом приложении 12000+ пользовательских схем с 200+ таблиц в каждой.zVlad wrote: ↑12 Sep 2021 02:17Красиво поешь. А когда в базе данных полторы тысячи таблиц?Uzito wrote: ↑12 Sep 2021 01:37 Дорогие друзья, задача "удалить дубликаты из таблицы" практически никогда не встречается. Это задача для интервью письками померяться кто изрощрённей метод придумает.
Любой ДБА вам скажет, что лучше сохранить старую таблицу и сделать новую без дубликатов как Вам хочется. А то мало ли что Вы там наудаляете в продакшене. У Вас будет возможность проверить новую табличку что все получилось как надо, а бэкап уже потом как-нибудь удалим, через месяц-два.
-
- Уже с Приветом
- Posts: 1961
- Joined: 24 Feb 2001 10:01
- Location: Челябинск -> Everett, WA
Re: Зачем появляются новые языки программирования? Сколько их и каких на самом деле нужно?
Я сейчас в гостях. Пью пиво. Завтра утром выдам развернутый ответ
Sent from my iPhone using Tapatalk Pro
Sent from my iPhone using Tapatalk Pro
-
- Уже с Приветом
- Posts: 2268
- Joined: 29 Jul 2005 17:39
- Location: Калифорнийский Мухосранск
Re: Зачем появляются новые языки программирования? Сколько их и каких на самом деле нужно?
Хватает только условия на a.ROWID > (SELECT min(ROWID) FROM T as b WHERE a.fld1 = b.fld1 [AND a.fld2 = b.fld2 …])
и дополнительно проверять что этот a.ROIWID находится в подмножестве «правильных» ROWIDs именно для этих же значений ключевых полей fld1, fld2, … не нужно, потому что они и так этим подзапросом про min(ROWID) уже выбираются для этих и только для этих значений ключевых полей.
Вы ошибаетесь, все записи начиная с некоторого минимального значения ROWID удалены не будут, потому-то подзапрос на мин ROWID будет вычисляться и проверяться каждый раз для каждой записи с теми же значениями ключевых полей, а не один раз на весь DELETE.
-
- Уже с Приветом
- Posts: 1349
- Joined: 28 Nov 2008 17:50
Re: Зачем появляются новые языки программирования? Сколько их и каких на самом деле нужно?
фигасе, это жэ баг. с чего бы это оптимизатор обязан исключительно nested loop организовывать ?
я проверил, в оракле с rownum такое не работает.
-
- Уже с Приветом
- Posts: 15185
- Joined: 30 Apr 2003 16:43
Re: Зачем появляются новые языки программирования? Сколько их и каких на самом деле нужно?
Подзапрос возвращает каждый раз ровно одно значение, значение минимума rowid's всех строк удовлетворяющих предикату в подзапросе. Основной запрос на каждый найденый минимум будет удалять ВСЕ строки с rowid большими чем найденый в подзапросе. Это могут быть дубликаты по условию задачи и любые другие строки, не дубликаты.KinDzaDza wrote: ↑12 Sep 2021 03:55Хватает только условия на a.ROWID > (SELECT min(ROWID) FROM T as b WHERE a.fld1 = b.fld1 [AND a.fld2 = b.fld2 …])
и дополнительно проверять что этот a.ROIWID находится в подмножестве «правильных» ROWIDs именно для этих же значений ключевых полей fld1, fld2, … не нужно, потому что они и так этим подзапросом про min(ROWID) уже выбираются для этих и только для этих значений ключевых полей.
Вы ошибаетесь, все записи начиная с некоторого минимального значения ROWID удалены не будут, потому-то подзапрос на мин ROWID будет вычисляться и проверяться каждый раз для каждой записи с теми же значениями ключевых полей, а не один раз на весь DELETE.
Фактически, да все дубликаты, кроме одного, будут удалены в первой же итерации на подзапросе, но вместе с ними будут удалены и все остальные строки за той что будет обработана первой.
Даже если первая строка в таблице не имеет дубликатов delete будет выполнен и в результате в таблице останется одна строка. Первая если delete работает в порядке порядке возрастания rowid's, что в общем случае не обязательно поскольку по теории физический порядок строк не зависит от значений в столбцах, даже если это rowid.
Таким образом результат этого delete будет не предсказуемым. Таблица будет проряжена и транкейтнута случайным образом.
-
- Уже с Приветом
- Posts: 15185
- Joined: 30 Apr 2003 16:43
Re: Зачем появляются новые языки программирования? Сколько их и каких на самом деле нужно?
Отлично. Ну а теперь примените предложенный Вами метод борьбы с дубликатами к таким БД которые у Вас.Uzito wrote: ↑12 Sep 2021 02:41Вопрос из серии "напугал ежа голой жопой". У меня 1800+ таблиц только в одном приложении. В другом приложении 12000+ пользовательских схем с 200+ таблиц в каждой.zVlad wrote: ↑12 Sep 2021 02:17Красиво поешь. А когда в базе данных полторы тысячи таблиц?Uzito wrote: ↑12 Sep 2021 01:37 Дорогие друзья, задача "удалить дубликаты из таблицы" практически никогда не встречается. Это задача для интервью письками померяться кто изрощрённей метод придумает.
Любой ДБА вам скажет, что лучше сохранить старую таблицу и сделать новую без дубликатов как Вам хочется. А то мало ли что Вы там наудаляете в продакшене. У Вас будет возможность проверить новую табличку что все получилось как надо, а бэкап уже потом как-нибудь удалим, через месяц-два.
Кстати, это нонсенс создавать такие архитектуры как у Вас.
-
- Уже с Приветом
- Posts: 15185
- Joined: 30 Apr 2003 16:43
Re: Зачем появляются новые языки программирования? Сколько их и каких на самом деле нужно?
А может кто-нибудь из знатоков программирования объяснить почему байт код и виртуальная машина интерпретирующая его?
-
- Уже с Приветом
- Posts: 63377
- Joined: 03 Nov 2004 05:31
- Location: RU -> Toronto, ON
Re: Зачем появляются новые языки программирования? Сколько их и каких на самом деле нужно?
что почему? скорее для чего?
"Write Once Run Anywhere"
К примеру Java приложение может в теории без перекомпиляции выполняться на MF и внутри smart card.
"В теории" - потому что реальное приложение зависит от наличия базовых frameworks, которые будут разные в Java SE и Java Card. Но сам байт код будет действительно выполняться и там, и там.
При использовании JIT (just in time compiler) потери в производительности минимальны.
Но C++ как правило будет быстрее. При "промышленной" разработке софта необходимо учитывать, сколько потом усилий уйдет на отладку и вылавливание блох. С++ требует недюжей дисциплинированности программиста, потому цена разработки на С++ будет выше.
https://benchmarksgame-team.pages.debia ... /java.html
"Write Once Run Anywhere"
К примеру Java приложение может в теории без перекомпиляции выполняться на MF и внутри smart card.
"В теории" - потому что реальное приложение зависит от наличия базовых frameworks, которые будут разные в Java SE и Java Card. Но сам байт код будет действительно выполняться и там, и там.
При использовании JIT (just in time compiler) потери в производительности минимальны.
Но C++ как правило будет быстрее. При "промышленной" разработке софта необходимо учитывать, сколько потом усилий уйдет на отладку и вылавливание блох. С++ требует недюжей дисциплинированности программиста, потому цена разработки на С++ будет выше.
https://benchmarksgame-team.pages.debia ... /java.html
Not everyone believes what I believe but my beliefs do not require them to.
-
- Уже с Приветом
- Posts: 15185
- Joined: 30 Apr 2003 16:43
Re: Зачем появляются новые языки программирования? Сколько их и каких на самом деле нужно?
Это здорово что ответили именно Вы. Тогда скажите как называется процесс выполнения байт кода?Flash-04 wrote: ↑12 Sep 2021 16:25 что почему? скорее для чего?
"Write Once Run Anywhere"
К примеру Java приложение может в теории без перекомпиляции выполняться на MF и внутри smart card.
"В теории" - потому что реальное приложение зависит от наличия базовых frameworks, которые будут разные в Java SE и Java Card. Но сам байт код будет действительно выполняться и там, и там.
При использовании JIT (just in time compiler) потери в производительности минимальны.
Но C++ как правило будет быстрее. При "промышленной" разработке софта необходимо учитывать, сколько потом усилий уйдет на отладку и вылавливание блох. С++ требует недюжей дисциплинированности программиста, потому цена разработки на С++ будет выше.
https://benchmarksgame-team.pages.debia ... /java.html
Ну и чтобы два раза не вставать скажите почему все таки нельзя обойтись без байт кода даже если не нужна переносимость?
-
- Уже с Приветом
- Posts: 1961
- Joined: 24 Feb 2001 10:01
- Location: Челябинск -> Everett, WA
Re: Зачем появляются новые языки программирования? Сколько их и каких на самом деле нужно?
Упростим для ясности безо всяких rowid.
select * from my_table;
id name
1 aaa
2 aaa
3 aaa
4 aaa
5 bbb
6 bbb
7 ccc
1) По каждой записи в таблице найдем минимальный id с тем же name:
select t.id,
t.name,
(select min(id) from my_table where name = t.name) as min_id
from my_table t;
id name min_id
1 aaa 1
2 aaa 1
3 aaa 1
4 aaa 1
5 bbb 5
6 bbb 5
7 ccc 7
Если не отвлекаться на оптимальность запроса, никаких противоречий и багов тут нет.
Теперь сравниваем 1-ю и 3-ю колонку.
2) Вот эти записи мы хотим оставить:
select t.id,
t.name
from my_table t
where t.id = (select min(id) from my_table where name = t.name) ;
id name
1 aaa
5 bbb
7 ccc
3) А вот эти записи мы хотим удалить:
select t.id,
t.name
from my_table t
where t.id > (select min(id) from my_table where name = t.name)
id name
2 aaa
3 aaa
4 aaa
6 bbb
Вместо ">" можно поставить "!=", не важно.
select * from my_table;
id name
1 aaa
2 aaa
3 aaa
4 aaa
5 bbb
6 bbb
7 ccc
1) По каждой записи в таблице найдем минимальный id с тем же name:
select t.id,
t.name,
(select min(id) from my_table where name = t.name) as min_id
from my_table t;
id name min_id
1 aaa 1
2 aaa 1
3 aaa 1
4 aaa 1
5 bbb 5
6 bbb 5
7 ccc 7
Если не отвлекаться на оптимальность запроса, никаких противоречий и багов тут нет.
Теперь сравниваем 1-ю и 3-ю колонку.
2) Вот эти записи мы хотим оставить:
select t.id,
t.name
from my_table t
where t.id = (select min(id) from my_table where name = t.name) ;
id name
1 aaa
5 bbb
7 ccc
3) А вот эти записи мы хотим удалить:
select t.id,
t.name
from my_table t
where t.id > (select min(id) from my_table where name = t.name)
id name
2 aaa
3 aaa
4 aaa
6 bbb
Вместо ">" можно поставить "!=", не важно.
-
- Уже с Приветом
- Posts: 63377
- Joined: 03 Nov 2004 05:31
- Location: RU -> Toronto, ON
Re: Зачем появляются новые языки программирования? Сколько их и каких на самом деле нужно?
процесс исполнения байт кода по сути ничем не отличается от исполнения процессорного кода. Не верите? SUN даже разработал picoJava - hardware implementation Java машины, можно сделать на базе FPGA к примеру.
Современные процессоры тоже не исполняют свои инструкции "as is", внутри их есть ещё один уровень - "микрокод".
"Microcode is a technique that interposes a layer of computer organization between the CPU hardware and the programmer-visible instruction set architecture of the computer"
Обойтись можно, но Java была создана именно как готовый "виртуальный процессор" который можно испольнять on-top других систем.
Кстати, чего вы решили что переносимость не нужна? Немало приложений которые могут испольняться под управлением Windows или Linux, но достигать этого можно по разному. Java - один из возможных способов.
Хороший пример: Android OS. Приложения написаны на Java и могут испольняться на любом "железе" на котором установлена Android OS. Разработчикам приложений не нужно думать какой процессов будет на телефоне, им остается только волноваться за разрешение экрана, чтобы приложение корректно отображалось на любом из них.
Not everyone believes what I believe but my beliefs do not require them to.