Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.10.2014, 17:05   #1
Seregakz
Пользователь
 
Регистрация: 21.05.2008
Сообщений: 14
Восклицание SQL SELECT IN

Форумчане подскажите, имеется запрос:
SELECT * FROM `sssd` WHERE number IN ('111', '222')
Вывод:
id number
1 111
2 222

Как модифицировать этот запрос? допустим если 222 нет в БД то всё равно вывести поле только с параметром NULL.

как должно работать пример:
SELECT * FROM `sssd` WHERE number IN ('111', '222', '333')

111 111
222 222
333 NULL

Идеи не приходят! база огромная! нужен лёгкий запрос! Спасиб!

Последний раз редактировалось Seregakz; 28.10.2014 в 17:19.
Seregakz вне форума Ответить с цитированием
Старый 28.10.2014, 17:14   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Что-то слишком заумно. Сначала стоит подумать - а нужно ли оно. Почти уверен - не нужно
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 28.10.2014, 17:18   #3
Seregakz
Пользователь
 
Регистрация: 21.05.2008
Сообщений: 14
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Что-то слишком заумно. Сначала стоит подумать - а нужно ли оно. Почти уверен - не нужно
Нужно очень, я в посте облегчил вопрос, так будет понятнее! нужно чтобы каждое значение в IN сравнил если оно есть, то вывел если нет то вывел напротив тех значений которых нет NULL
Seregakz вне форума Ответить с цитированием
Старый 28.10.2014, 17:28   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Ну ладно. Единственное и сразу пришло в голову - хранимка, которой передается список значений. Она и строит выходной набор данных
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 28.10.2014, 17:31   #5
Seregakz
Пользователь
 
Регистрация: 21.05.2008
Сообщений: 14
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Ну ладно. Единственное и сразу пришло в голову - хранимка, которой передается список значений. Она и строит выходной набор данных
Имеете ввиду хранить в процедуре и сравнивать? или создавать темп бд?

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

Последний раз редактировалось Seregakz; 28.10.2014 в 17:36.
Seregakz вне форума Ответить с цитированием
Старый 28.10.2014, 18:05   #6
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,768
По умолчанию

Нужно сделать inline-таблицу и подключиться к ней внешним объединением:
Код:
select
  a.id, sssd.*
from
  sssd
left join (
  select 1111 id
  union all
  select 2222
  union all
  select 333
) a
on
  sssd.id = a.id
Vapaamies вне форума Ответить с цитированием
Старый 28.10.2014, 18:50   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Наоборот sssd засунуть в left join. А поскольку число параметров заранее не известно, то и предлагал передать их процедуре в стринговом виде через запятую, а в ней либо запрос динамически сформировать, либо эти значения засунуть во временную таблицу
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 28.10.2014, 19:11   #8
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,768
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Наоборот sssd засунуть в left join.
Да, перепутал. Также можно, не изменяя запрос полностью, вместо left join написать right join.
Vapaamies вне форума Ответить с цитированием
Старый 28.10.2014, 19:19   #9
Seregakz
Пользователь
 
Регистрация: 21.05.2008
Сообщений: 14
По умолчанию

Цитата:
Сообщение от Vapaamies Посмотреть сообщение
Да, перепутал. Также можно, не изменяя запрос полностью, вместо left join написать right join.
Cпасиб, но при выполнении:

SELECT a.id, sssd . *
FROM sssd
RIGHT JOIN (

SELECT 111 id
UNION ALL
SELECT 222
UNION ALL
SELECT 333
)a ON sssd.id = a.id


Получаю:
id id number
111 NULL NULL
222 NULL NULL
333 NULL NULL

А необходимо если только значения нет в бд вывести null (допусти 333 нет, то):
111 111
222 222
333 NULL
Seregakz вне форума Ответить с цитированием
Старый 28.10.2014, 19:22   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

id или number?

Код:
SELECT a.number, sssd.number
  FROM sssd
RIGHT JOIN (

SELECT 111 number
UNION ALL 
SELECT 222 
UNION ALL 
SELECT 333
)a ON sssd.number = a.number
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
MS SQL ADO Как вывести через запрос Select из двух баз данных по совпадающему id? SovereignSun SQL, базы данных 2 17.01.2012 17:59
sql запрос select Olegka_ БД в Delphi 11 27.03.2011 16:55
ADO-MS SQL Не выполняется запрос SELECT Dj_SheLL Помощь студентам 10 23.11.2010 14:17
SELECT синтаксис) (SQL) k_a_m_a_z Помощь студентам 4 14.06.2010 15:34
SELECT SQL vmilyoshin Помощь студентам 1 20.02.2010 09:41