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

Откуда:
Сообщений: 181
Кто-нибудь подскажите, что не правильно я записал в данном запросе, ни как не хочет выполнять.

USE SOV_2009
GO

SELECT K2, H1 FROM dbo.AllMain_2
WHERE
dbo.AllMain_2.K2 = (SELECT K2 FROM dbo.AllMain_1)
and
dbo.AllMain_2.H1 = (SELECT H1 FROM dbo.AllMain_1)

Выдаёт вот такое сообщение
Msg 512, Level 16, State 1, Line 2
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

Цель данного запроса произвести сравнение, нет ли одинаковых записей по ключам в одинаковых по структуре таблицами, но за разные промежутки времени.
27 дек 09, 11:42    [8123241]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи!!!  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3264
Teslenko Sergey,

Перевести ?

2. ипользовать JOIN двух таблиц по ключам с указанием промежутков времени. а вообще вы читать умеете ? Вот здесь
27 дек 09, 11:51    [8123251]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи!!!  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Teslenko Sergey
Цель данного запроса произвести сравнение,
нет ли одинаковых записей по ключам в одинаковых по структуре таблицами,
но за разные промежутки времени.
Ничего похожего из Вашего запроса не видно.
Где ключи, где промежутки времени?
Teslenko Sergey
что не правильно я записал в данном запросе
Поле таблицы оператором "=" можно сравнить только с одним значением.
Но подзапрос возвращает много строк. Надо пользоваться другими предикатами, например, IN или EXISTS.
Но если механически заменить "=" на указанные предикаты в данном случае, то это Вам не поможет (надо всё по-другому переписать).
Другой подход - изучить и использовать JOIN
27 дек 09, 11:53    [8123253]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи!!!  [new]
DataFlower
Member

Откуда: Киев
Сообщений: 9369
Teslenko Sergey
Цель данного запроса произвести сравнение, нет ли одинаковых записей по ключам в одинаковых по структуре таблицами, но за разные промежутки времени.


Если нужно за разные промежутки времени, то где поля, которые сравниваются неравенством? Или <> или != уж не помню, что там в ms sql. Ну да ладно....

Вот примерный запрос, если нужно выбрать все записи первой таблицы такие, что существует хотя бы одна запись во второй таблице с совпадающими значениями соответствующих полей.

SELECT
dbo.AllMain_2.K2, dbo.AllMain_2.H1
FROM
dbo.AllMain_2
INNER JOIN dbo.AllMain_1
ON dbo.AllMain_2.K2 = dbo.AllMain_1.K2 and dbo.AllMain_2.H1 = dbo.AllMain_1.H1

В твоем же примере, если поставить IN вместо = , то будут выданы записи первой таблицы, поля которой совпадают с полями не обязательно одной и той же записи второй таблицы.

То есть, (1)
WHERE
dbo.AllMain_2.K2 IN (SELECT K2 FROM dbo.AllMain_1)
and
dbo.AllMain_2.H1 IN (SELECT H1 FROM dbo.AllMain_1)

это не то же самое, что

(2)
WHERE (dbo.AllMain_2.K2, dbo.AllMain_2.H1) IN (SELECT K2, H1 FROM dbo.AllMain_1)
Не уверена в MS SQL этот синтаксис работает, скорее нет, чем да, но это для иллюстрации.

AllMain_2
K2 H1
1 А
1 Б
2 В


AllMain_1
K2 H1
1 А
1 В
3 Б


При (1) результат такой
K2 H1
1 А
1 Б


При (2), если синтаксис допускает, то результат будет такой
K2 H1
1 А


Пример с inner join результат будет тот же, что и при (2).


----------------------
Трудно быть богом! А богиней - приятно...
27 дек 09, 17:27    [8123920]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи!!!  [new]
Teslenko Sergey
Member

Откуда:
Сообщений: 181
Спасибо, я понял, что не правильно делал.
10 янв 10, 15:04    [8161817]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить