Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Выбор 1-го из 2-х  [new]
vso
Member

Откуда: СПб
Сообщений: 270
Добрый день!

Есть таблица Table1
F1 F2 F3 F4
A1 B1 1 X1
A1 B1 2 X1
A1 B1 3 X1
B1 A1 1 X1
B1 A1 2 X1
B1 A1 3 X1
A2 B2 1 X2
A2 B2 2 X2
A2 B2 3 X2
A2 B2 4 X2
B2 A2 1 X2
B2 A2 2 X2
B2 A2 3 X2
B2 A2 4 X2
A3 B3 1 X3
A3 B3 2 X3
A3 B3 3 X3
A3 B3 4 X3
A3 B3 5 X3
B3 A3 1 X3
B3 A3 2 X3
B3 A3 3 X3
B3 A3 4 X3
B3 A3 5 X3


Если сделать просто
SELECT DISTINCT F1, F2, F4 FROM Table1


то получится
F1 F2 F4
A1 B1 X1
B1 A1 X1
A2 B2 X2
B2 A2 X2
A3 B3 X3
B3 A3 X3


подскажите как сделать, чтобы получилось
F1 F2 F4
A1 B1 X1
A2 B2 X2
A3 B3 X3


заранее спасибо...
21 дек 15, 20:49    [18590915]     Ответить | Цитировать Сообщить модератору
 Re: Выбор 1-го из 2-х  [new]
Glory
Member

Откуда:
Сообщений: 104751
vso
подскажите как сделать, чтобы получилось
F1 F2 F4
A1 B1 X1
A2 B2 X2
A3 B3 X3

сделать проверку на not exists "перевертыша" по F1, F2
21 дек 15, 20:52    [18590929]     Ответить | Цитировать Сообщить модератору
 Re: Выбор 1-го из 2-х  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1836
vso,

SELECT * FROM (SELECT DISTINCT F1, F2, F4 FROM Table1) t WHERE t.F1 LIKE 'A[0-9]' AND t.F2 LIKE 'B[0-9]' AND t.F4 LIKE 'X[0-9]'
21 дек 15, 20:57    [18590948]     Ответить | Цитировать Сообщить модератору
 Re: Выбор 1-го из 2-х  [new]
vso
Member

Откуда: СПб
Сообщений: 270
Glory,

что Вы понимаете по "перевертышем"?
22 дек 15, 08:08    [18592172]     Ответить | Цитировать Сообщить модератору
 Re: Выбор 1-го из 2-х  [new]
Glory
Member

Откуда:
Сообщений: 104751
vso
Glory,

что Вы понимаете по "перевертышем"?

Вот это
A1 B1 X1
B1 A1 X1
22 дек 15, 08:10    [18592176]     Ответить | Цитировать Сообщить модератору
 Re: Выбор 1-го из 2-х  [new]
vso
Member

Откуда: СПб
Сообщений: 270
Glory,

SELECT DISTINCT F1, F2, F4 FROM Table1 ouer
WHERE NOT EXISTS (SELECT * FROM Table1 inner WHERE outer.F1 = inner.F2 and outer.F2 = inner.F1)


выдает пустоту

ну вроде и логично так как

КАК РАБОТАЕТ EXISTS?
EXISTS - это оператор, который производит верное или неверное значение, другими словами, выражение Бул


а так как всегда есть ответная строка перевертышь, то EXISTS всегда вернет true, а NOT превратит его в false

или я не правильно составил запрос?
22 дек 15, 08:47    [18592265]     Ответить | Цитировать Сообщить модератору
 Re: Выбор 1-го из 2-х  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21242
SELECT
  CASE WHEN F1<F2 THEN F1 ELSE F2 END F1
, CASE WHEN F1<F2 THEN F2 ELSE F1 END F2
, F4 
FROM 
  Table1
GROUP BY
  F4
22 дек 15, 08:55    [18592286]     Ответить | Цитировать Сообщить модератору
 Re: Выбор 1-го из 2-х  [new]
vso
Member

Откуда: СПб
Сообщений: 270
Akina,

Работает, только так

SELECT * FROM (
SELECT DISTINCT
  CASE WHEN F1<F2 THEN F1 ELSE F2 END F1
, CASE WHEN F1<F2 THEN F2 ELSE F1 END F2
, F4 
FROM 
  Table1 ) G
GROUP BY
  G.F1,
  G.F2,  
  G.F4


но учитывая, что это только ядро для формирования данных получается давольно долго, может есть способ побыстрее?
22 дек 15, 10:35    [18592744]     Ответить | Цитировать Сообщить модератору
 Re: Выбор 1-го из 2-х  [new]
Glory
Member

Откуда:
Сообщений: 104751
vso
SELECT DISTINCT F1, F2, F4 FROM Table1 ouer
WHERE NOT EXISTS (SELECT * FROM Table1 inner WHERE outer.F1 = inner.F2 and outer.F2 = inner.F1)



выдает пустоту

SELECT DISTINCT F1, F2, F4 FROM Table1 ouer
WHERE NOT EXISTS (SELECT * FROM Table1 inner WHERE outer.F1 = inner.F2 and outer.F2 = inner.F1
AND inner.ID < outer.ID)
22 дек 15, 10:38    [18592757]     Ответить | Цитировать Сообщить модератору
 Re: Выбор 1-го из 2-х  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21242
vso
Работает, только так

Можно и, например
SELECT
  MIN(CASE WHEN F1<F2 THEN F1 ELSE F2 END) F1
, MIN(CASE WHEN F1<F2 THEN F2 ELSE F1 END) F2
, F4 
FROM 
  Table1
GROUP BY
  F4


vso
это только ядро для формирования данных получается давольно долго, может есть способ побыстрее?

Есть. Нормализуйте хранение/обработку данных так, чтобы для каждой записи гарантированно выполнялось условие F1<=F2.
22 дек 15, 12:11    [18593401]     Ответить | Цитировать Сообщить модератору
 Re: Выбор 1-го из 2-х  [new]
vso
Member

Откуда: СПб
Сообщений: 270
Akina,

база не моя, я могу только забрать те данные которые мне нужны.
22 дек 15, 14:00    [18594108]     Ответить | Цитировать Сообщить модератору
 Re: Выбор 1-го из 2-х  [new]
xerver
Guest
SELECT DISTINCT MIN(F1, F2), MAX(F1, F2), F4 FROM Table1 
???
22 дек 15, 14:29    [18594376]     Ответить | Цитировать Сообщить модератору
 Re: Выбор 1-го из 2-х  [new]
XTM
Member

Откуда: Moscow
Сообщений: 8
SELECT DISTINCT F1, F2, F4 FROM Table1 WHERE F1< F2
22 дек 15, 15:00    [18594700]     Ответить | Цитировать Сообщить модератору
 Re: Выбор 1-го из 2-х  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21242
xerver
SELECT DISTINCT MIN(F1, F2)

В MS SQL функция MIN() - только агрегатная.
XTM
SELECT DISTINCT F1, F2, F4 FROM Table1 WHERE F1< F2

Потеряются данные непарных записей, не отвечающих условию.
22 дек 15, 15:04    [18594725]     Ответить | Цитировать Сообщить модератору
 Re: Выбор 1-го из 2-х  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
XTM
SELECT DISTINCT F1, F2, F4 FROM Table1 WHERE F1< F2
А если есть только пара F1 > F2 ?
22 дек 15, 15:05    [18594732]     Ответить | Цитировать Сообщить модератору
 Re: Выбор 1-го из 2-х  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21242
Ещё вариант
SELECT F1, F2, F4 FROM Table1 WHERE F1 < F2
UNION
SELECT F2, F1, F4 FROM Table1 WHERE F1 >= F2
22 дек 15, 15:06    [18594739]     Ответить | Цитировать Сообщить модератору
 Re: Выбор 1-го из 2-х  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
declare @t table (F1 varchar(2),F2 varchar(2),	F3 int,	F4 varchar(2))

insert into @t (F1, F2, F3, F4)
values
('A1', 'B1', 1	,'X1'),
('A1', 'B1', 2	,'X1'),
('A1', 'B1', 3	,'X1'),
('B1', 'A1', 1	,'X1'),
('B1', 'A1', 2	,'X1'),
('B1', 'A1', 3	,'X1'),
('A2', 'B2', 1	,'X2'),
('A2', 'B2', 2	,'X2'),
('A2', 'B2', 3	,'X2'),
('A2', 'B2', 4	,'X2'),
('B2', 'A2', 1	,'X2'),
('B2', 'A2', 2	,'X2'),
('B2', 'A2', 3	,'X2'),
('B2', 'A2', 4	,'X2'),
('A3', 'B3', 1	,'X3'),
('A3', 'B3', 2	,'X3'),
('A3', 'B3', 3	,'X3'),
('A3', 'B3', 4	,'X3'),
('A3', 'B3', 5	,'X3'),
('B3', 'A3', 1	,'X3'),
('B3', 'A3', 2	,'X3'),
('B3', 'A3', 3	,'X3'),
('B3', 'A3', 4	,'X3'),
('B3', 'A3', 5	,'X3')


select MIN(A.F1) as F1, MAX(A.F2) as F2, A.F4
from @t A
where A.F3 = 1
GROUP BY A.F4
22 дек 15, 15:20    [18594836]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить