ortal1 Ответов: 2

Не более одной записи может быть возвращено этим подзапросом-пожалуйста, помогите!


У меня есть этот запрос, и он показывает это сообщение-
"не более одной записи может быть возвращено этим подзапросом"
я работаю с c# и access, может кто-нибудь мне помочь?

Что я уже пробовал:

command.CommandText = "select id_women as תעודת_זהות_אישה,fname as שם_פרטי,lname as שם_משפחה,picture as תמונה,meeting as במפגש from women2 where (age=(select age_min from men_expectations2) and height=(select height_min from men_expectations2) and body_structure=(select body_structure from men_expectations2) and health=(select health from men_expectations2) and status=(select status from men_expectations2)) and (origin=(select origin from men_expectations2) or hashkafa=(select hashkafa from men_expectations2) or living_area=(select living_area from men_expectations2) or smoking=(select smoking from men_expectations2) or tfila=(select tfila from men_expectations2)) and Change_residence=(select Change_residence from men_expectations2) and headdress=(select headdress from men_expectations2 WHERE id_men = '" + textBox1.Text + "');";

2 Ответов

Рейтинг:
1

Christian Graus

В этом контексте ваши подзапросы должны возвращать только одну запись. Вам нужен какой-то оператор where, который присоединяется к одной записи.

Это ужасно длинный вопрос. Это множество подзапросов будет работать плохо, как только оно заработает. Я хотел бы посмотреть на использование обобщенных табличных выражений и вместо этого присоединяется


ortal1

не могли бы вы помочь мне написать лучший запрос?

Christian Graus

Я даже не могу это прочесть. теряйте псевдонимы, когда вы просите помощи у носителей английского языка. Я восхищаюсь вашими двуязычными навыками, но они не помогают мне читать его. Кроме того, отформатируйте его лучше. Но мне нужно знать формат данных, чтобы попытаться написать запрос, который будет работать. Попробуйте объяснить мне, что, по вашему мнению, будут делать подзапросы

ortal1

Прошу прощения за язык...
подзапросы должны отображать параметры:id_women,fname,lname,picture,meeting из таблицы "women2" если конкретные параметры ,которые я выбрал из таблицы "women2", равны конкретным параметрам таблицы "men_expectations2", то поиск выполняется по id_men из таблицы "men_expectations2", которые пользователь вводит в "textbox1".
Общая идея программы заключается в том, чтобы соответствовать между мужчинами и женщинами.
пожалуйста, мне действительно нужна помощь!
надеюсь, на этот раз я объяснился лучше...

Christian Graus

Итак, вам нужно объединить эти две таблицы по этим параметрам? Для этого вам не нужны подзапросы. Просто соедините мужчин с женщинами и сделайте соединение на этих возможностях

ortal1

ты можешь показать мне, как это делается? я не знаю, как использовать in join, и боюсь застрять с этим надолго..

Christian Graus

Вы не знаете, как сделать соединение? есть ли у этих двух таблиц какие-либо общие данные? Если нет, вы можете сделать левое соединение.


выберите * от мужчин M левое внешнее соединение женщины ж о м.ИД = Вт.код // можно вообще ничего не совпадает
где (m.expectations = w.expectation2 или m.age = w.age) //и т. д
и еще m.id is not null // отфильтровать женщин

Это вернет всех мужчин, где одно из полей совпадает между мужчинами и женщинами в операторах or.

Это будет очень медленно, если все эти столбцы не будут проиндексированы, это будет включать в себя полное сканирование таблиц

Christian Graus

Конечно, тот самый m.id значение not null не требуется, если ни один из столбцов в соединении не совпадает. Левое соединение вернет все значения слева, даже если они не совпадают с соединением

Рейтинг:
0

OriginalGriff

Когда вы используете SELECT как часть условия, подкласс может возвращать только один элемент, потому что именно так работают операторы сравнения, такие как"=": если вы сравниваете один элемент с двумя другими, результат не определяется, как и в реальном мире. Равен ли этот апельсин этому (одно яблоко, Два банана, один апельсин) или нет? Вы не знаете, я не знаю - просто потому, что нет "настоящего" ответа.

Вероятно, вам нужно сделать соединение вместо этого, но поскольку мы не имеем представления о структуре ваших таблиц и отношениях между ними, мы не можем сказать наверняка или рекомендовать какой-либо код, который вы могли бы попробовать. Поэтому подумайте о данных в ваших таблицах и о том, что именно вы пытаетесь получить, прежде чем приступать к кодированию сложного запроса! Или дайте нам пример ввода и вывода и объясните, почему это так ...

Но у вас есть гораздо более серьезная проблема!
Никогда не объединяйте строки для построения команды SQL. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого всегда используйте параметризованные запросы.

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?