SQL

Glushk
Новичок
Posts: 27
Joined: 22 Jul 2004 15:58

SQL

Post by Glushk »

May be somebody had the same problem. There are two the same (identical) rows in the table in SQL. For example , we got this table from Excell. Initially, it was a record of guests viting the restorant, and for whatever reason, we duplicate one row.

We need to have just one row. Problem: How to delete one row?

Thank you.
User avatar
-JS-
Уже с Приветом
Posts: 1015
Joined: 05 Aug 2004 18:50
Location: US, East

Post by -JS- »

Add PK and use it to delete the dups
User avatar
WildVlad
Уже с Приветом
Posts: 3982
Joined: 13 Jul 2000 09:01
Location: SVX -> BOS -> BUR -> SJC

Post by WildVlad »

Создайте курсор, например,
SELECT * FROM mytable WHERE A='A' AND B=2
так чтобы в резальтсете были только строчки из которых надо выкинуть дубликаты, потом в программе идите по курсору и проверив, что мы текущая строка не первая (счётчик в цикле сами заведите), удаляйте текущую строку.
I hated LA
User avatar
katit
Уже с Приветом
Posts: 23804
Joined: 05 Jul 2003 22:34
Location: Брест -> St. Louis, MO

Post by katit »

WildVlad wrote:Создайте курсор, например,
SELECT * FROM mytable WHERE A='A' AND B=2
так чтобы в резальтсете были только строчки из которых надо выкинуть дубликаты, потом в программе идите по курсору и проверив, что мы текущая строка не первая (счётчик в цикле сами заведите), удаляйте текущую строку.


И что, когда вы так сказали на интервью - то вас взяли? :wink:
User avatar
WildVlad
Уже с Приветом
Posts: 3982
Joined: 13 Jul 2000 09:01
Location: SVX -> BOS -> BUR -> SJC

Post by WildVlad »

katit wrote:И что, когда вы так сказали на интервью - то вас взяли? :wink:
При чём здесь интервью? Ну и чем решение использовать курсор для удаления записей из таблицы плохо? Если delete написать не получается?
I hated LA
Glushk
Новичок
Posts: 27
Joined: 22 Jul 2004 15:58

Post by Glushk »

WildVlad wrote:
katit wrote:И что, когда вы так сказали на интервью - то вас взяли? :wink:
При чём здесь интервью? Ну и чем решение использовать курсор для удаления записей из таблицы плохо? Если delete написать не получается?


Kursor is primary key, or index?
Index would not work, because of dups, and delete does not work.
User avatar
WildVlad
Уже с Приветом
Posts: 3982
Joined: 13 Jul 2000 09:01
Location: SVX -> BOS -> BUR -> SJC

Post by WildVlad »

Glushk wrote:Kursor is primary key, or index?
Index would not work, because of dups, and delete does not work.

Нет, это несколько другое. То есть здесь чистым SQLем не обойтись. (Можно написать Stored procedure, но хрен редьки не слаще).
Из программы можно запустить SQL-выражение, возвращающее ResultSet (DataSet whatever depends on programming language), и затем можно ходить по возращённому resultset'у (иногда произвольно, иногда только вперёд, иногда только назад), модифицировать, втсавлять и удалять данные в нём и изменения будут сохранены в базе (если сделаете commit).

Примечание: некторые базы и/или языки программирования требуют специального режима запуска SQL-запросов, для того, чтобы можно было модифицировать resultset.

Ну или можно написать stored procedure, которая суть есть программа, только выполняется сразу базой данных, и st proc сделает то же самое.
I hated LA
User avatar
-JS-
Уже с Приветом
Posts: 1015
Joined: 05 Aug 2004 18:50
Location: US, East

Post by -JS- »

CREATE TABLE AA
(
A VARCHAR(10),
B VARCHAR(10)
)

INSERT INTO AA VALUES('A1', 'B1')
INSERT INTO AA VALUES('A1', 'B1')
INSERT INTO AA VALUES('A2', 'B2')
INSERT INTO AA VALUES('A2', 'B2')


SELECT * FROM AA

ALTER TABLE AA
ADD ID INT IDENTITY(0,1)

DELETE FROM AA
WHERE 1 < (SELECT COUNT(*) FROM AA A1 WHERE A1.A= AA.A)
AND ID > ( SELECT MIN(ID) FROM AA A2 WHERE A2.A= AA.A)

SELECT * FROM AA

ALTER TABLE AA
DROP COLUMN ID
User avatar
katit
Уже с Приветом
Posts: 23804
Joined: 05 Jul 2003 22:34
Location: Брест -> St. Louis, MO

Post by katit »

Да. Или сделать

Code: Select all

SELECT INTO ... DISTINCT
DELETE

INSERT INTO
Glushk
Новичок
Posts: 27
Joined: 22 Jul 2004 15:58

Post by Glushk »

katit wrote:Да. Или сделать

Code: Select all

SELECT INTO ... DISTINCT
DELETE

INSERT INTO


select distinct works perfect, thank you.
User avatar
katit
Уже с Приветом
Posts: 23804
Joined: 05 Jul 2003 22:34
Location: Брест -> St. Louis, MO

Post by katit »

WildVlad wrote:При чём здесь интервью?


Ну как-бы этот вопрос в топ 10 на интервью по SQL. В ньюсгрупах он спрашивается примерно 3 раза в неделю :mrgreen:
User avatar
WildVlad
Уже с Приветом
Posts: 3982
Joined: 13 Jul 2000 09:01
Location: SVX -> BOS -> BUR -> SJC

Post by WildVlad »

katit wrote:Ну как-бы этот вопрос в топ 10 на интервью по SQL. В ньюсгрупах он спрашивается примерно 3 раза в неделю :mrgreen:
Ну... Я новстями SQLя интересуюсь мало :) Мне обычно хватает SELECT * написать, ну иногда парочку join'ов или саб-селектов ну на крайняк еще group by & having... И то раз в месяц - не чаще :)
Кстати, моё решение не использует временных таблиц. Да, я знаю, что взамен оно требует запуска запроса в тяжёлом режиме :)
I hated LA
Glushk
Новичок
Posts: 27
Joined: 22 Jul 2004 15:58

Post by Glushk »

katit wrote:
WildVlad wrote:При чём здесь интервью?


Ну как-бы этот вопрос в топ 10 на интервью по SQL. В ньюсгрупах он спрашивается примерно 3 раза в неделю :mrgreen:


One more SQL question:

I have 12 columns corresponding to months of a year. I need to summ all 12 months entry for each row. Syntax: ('column1')+('column2')+.....+(column12). Is there anything like : Column(1+12) ?
Thank you.
User avatar
SVK
Уже с Приветом
Posts: 8255
Joined: 23 Jul 2003 03:53
Location: SPb - KW - NY - CT - MD

Post by SVK »

Glushk wrote:I have 12 columns corresponding to months of a year. I need to summ all 12 months entry for each row. Syntax: ('column1')+('column2')+.....+(column12). Is there anything like : Column(1+12) ?
Thank you.

Любой синтаксис типа Sum(Column1:Column12) противоречил бы идеологии SQL: там ничего не базируется на предполагаемом порядке колонок таблицы. Это не Excel.

А чем кому не угодила простая сумма: C1+C2+C3+...+C12 ? Это настолько частный случай для DBMS, что совершенно незачем городить для этого отдельный синтаксис, функцию, или еще какую-нибудь хренотень...
LG - Life's good.
But good life is much better.
Glushk
Новичок
Posts: 27
Joined: 22 Jul 2004 15:58

Post by Glushk »

SVK wrote:
Glushk wrote:I have 12 columns corresponding to months of a year. I need to summ all 12 months entry for each row. Syntax: ('column1')+('column2')+.....+(column12). Is there anything like : Column(1+12) ?
Thank you.

Любой синтаксис типа Sum(Column1:Column12) противоречил бы идеологии SQL: там ничего не базируется на предполагаемом порядке колонок таблицы. Это не Excel.

А чем кому не угодила простая сумма: C1+C2+C3+...+C12 ? Это настолько частный случай для DBMS, что совершенно незачем городить для этого отдельный синтаксис, функцию, или еще какую-нибудь хренотень...


if you have 12 columns to summ up - it's fine. What if you have them for last 30 years? 360, it would be annoying to type all 360 column names...

Return to “Вопросы и новости IT”