powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Объединение двух SELECT
8 сообщений из 8, страница 1 из 1
Объединение двух SELECT
    #33505509
Лисонька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леди и джентльмены!
Подскажите, можно ли объединить два SELECT в одном? Пример:
Код: plaintext
1.
2.
3.
SELECT a1.nIdCod,a1.cFamily,a1.nBorn,c1.cStreet FROM a1  INNER JOIN c1 ON a1.nIdStreet=c1.nIdStreet WHERE NOT a1.nIdCod IN (SELECT b1.nIdCod FROM b1);
             INTO CURSOR tmp1
SELECT a1.nIdCod,a1.cFamily,a1.nBorn,c1.cStreet,b1.cKind FROM a1 INNER  JOIN c1 ON a1.nIdStreet=c1.nIdStreet;
              INNER JOIN b1 ON a1.nIdKind=b1.nIdKind WHERE a1.nIdCod IN (SELECT b1.nIdCod FROM b1) INTO CURSOR tmp2
Так... Кажется, ничего не напутала.
Идем дальше. Имеется пустая таблица Table1: nIdCod,cFamily,nBorn,cStreet,cKind. Я через APPEND FROM... сливаю по очереди в нее записи из обоих курсоров и работаю с ней. Ясно, что это все не рационально. Подскажите, как правильно сделать выборку, чтобы все сразу уходило в Table1.
Благодарю
...
Рейтинг: 0 / 0
Объединение двух SELECT
    #33505578
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UNION ALL
...
Рейтинг: 0 / 0
Объединение двух SELECT
    #33505581
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только оба запроса должны быть идентичны по возвращаемым колонкам.
...
Рейтинг: 0 / 0
Объединение двух SELECT
    #33505596
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Способы есть разные, но в вашем варианте проще всего использовать UNION

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
INSERT INTO Table1 (nIdCod,cFamily,nBorn,cStreet,cKind)  ;
SELECT a1.nIdCod,a1.cFamily,a1.nBorn,c1.cStreet ;
   FROM a1  INNER JOIN c1 ON a1.nIdStreet=c1.nIdStreet ;
   WHERE a1.nIdCod NOT IN (SELECT b1.nIdCod FROM b1) ;
UNION ALL ;
SELECT a1.nIdCod,a1.cFamily,a1.nBorn,c1.cStreet,b1.cKind  ;
   FROM a1 INNER  JOIN c1 ON a1.nIdStreet=c1.nIdStreet ;
   INNER JOIN b1 ON a1.nIdKind=b1.nIdKind  ;
WHERE a1.nIdCod IN (SELECT b1.nIdCod FROM b1)
Синтаксис вроде верный, но семантику запросов я не понял :)
С уважением, Алексей
...
Рейтинг: 0 / 0
Объединение двух SELECT
    #33506041
Лисонька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я сразу пробовала с UNION, выходила ошибка - это из-за того, что поля разные в запросах, теперь это поняла. Что ж, сейчас попробовала сделать одинаковые поля - один из запросов выходит ерундой. Позвольте задать тогда вопрос по другому.
В таблице b1 содержаться записи, связанные с таблицей а1 полем nIdKind. Вот и делаю 2 выборки из a1: записи, которым есть соответствие в b1, и которым нет. Как это сделать одним запросом?
Благодарю
...
Рейтинг: 0 / 0
Объединение двух SELECT
    #33506116
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то, через APPEND FROM не так уж и глупо.

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

На скорость это никак не повлияет, поскольку UNION ALL все-равно сначала делает 2 отдельные временные таблицы, а потом их сливает в одну. Просто он сам за собой убирает и еще может отфильтровать дубли.

По последнему вопросу.

ЛисонькаВ таблице b1 содержаться записи, связанные с таблицей а1 полем nIdKind. Вот и делаю 2 выборки из a1: записи, которым есть соответствие в b1, и которым нет. Как это сделать одним запросом?
Если исходить из ЭТОЙ постановки задачи, то достаточно вместо INNER JOIN использовать LEFT JOIN.

Код: plaintext
1.
2.
3.
4.
SELECT ;
...
FROM a1 ;
LEFT JOIN b1 ON a1.nIdKind=b1.nIdKind 

Если данные из b1 вообще не нужны, то это просто ВСЕ записи из a1 (!) и b1 тут ни с какого боку.

Но ведь в твоем запросе несколько другое условие реализовано.

1. Если записи связны по условию a1.nIdKind=b1.nIdKind, то должно выполняться ЕЩЕ ОДНО условие. Значение поля a1.nIdCod должно встречаться хотя бы в одной записи таблицы b1

2. Если записи НЕ связаны по условию, то значение поля a1.nIdCod НЕ должно встречаться ни в одной записи таблицы b1

Т.е. тут явно 2 РАЗНЫХ запроса. Один на сравнения с текущей записью, а другой на сравнение с любой записью.

Если записать условие "в лоб", то получиться примерно так:

Код: plaintext
1.
2.
3.
4.
5.
SELECT ;
...
FROM a1 ;
LEFT JOIN b1 ON a1.nIdKind=b1.nIdKind AND ;
	a1.nIdCod IN (SELECT b1.nIdCod FROM b1)
...
Рейтинг: 0 / 0
Объединение двух SELECT
    #33506224
Лисонька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, разобралась! Благодарю всех-всех-всех!
Прошу прощения за путанный ворос-запрос, разгребаю таблицы из FPD, доставшиеся мне в наследство с требованием немеделнно их реанимировать и запустить в производство. Хотя, думаю, легче бы мне было взяться просто написать БД заново со своими таблицами и перекачать в нее данные из всей этой пыльной рухляди.
Еще раз благодарю за помощь.

Елизавета Скрунскайте

P.S. Так и сделаю, перепишу заново
...
Рейтинг: 0 / 0
Объединение двух SELECT
    #33506334
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Лисонька!

Что-то я не понял твоих заросов... Может тебе надо просто через Left Join (а
не inner как во второй части запроса) подцепить b1 (по тому-же условию
связи) и в качестве последнего столбца написать PADR(NVL(b1.cKind,""), 20)
as cKind - где 20 это размер поля cKind.

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Объединение двух SELECT
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]