Этот запрос SQL требует вложенного запроса SELECT? Sql запрос вложенный запрос


sql - Как создать вложенный запрос select в sql

То, что я пытаюсь сделать, это создать раздел комментариев для веб-сайта,

Комментарии состоят из имени пользователя, электронной почты и комментариев. Я храню эти данные в таблице комментариев

CREATE TABLE `comments` ( `commentid` int(5) NOT NULL auto_increment, `user` varchar(40) NOT NULL default '', `email` varchar(100) NOT NULL default '', `comment` text NOT NULL, PRIMARY KEY (`commentid`) )

То, что я хочу сделать, это выполнить запрос, который захватывает все эти данные, а также проверяет адрес электронной почты в таблице "users" , чтобы узнать, существует ли он. Если это так, возьмите аватар из таблицы "misc". Если письмо не существует в таблице "users" , оно просто осталось пустым.

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

CREATE TABLE `users` ( `userid` int(25) NOT NULL auto_increment, `email` varchar(255) NOT NULL default '', `username` varchar(25) NOT NULL default '', PRIMARY KEY (`userid`) ) CREATE TABLE `misc` ( `miscid` int(4) NOT NULL auto_increment, `userid` varchar(3) NOT NULL default '', `avatar` varchar(100) NOT NULL default '', PRIMARY KEY (`miscid`) )

Я уверен, что мне нужно вложенное select в качестве имени столбца, чтобы, если есть электронное сообщение, оно отображается там... если оно не осталось пустым.

EDIT:

Создал структуры таблиц, как это должно быть.

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

SELECT c.comment, c.user, av.avatar FROM comments c INNER JOIN users u ON c.email = u.email LEFT OUTER JOIN ( SELECT userid, avatar FROM misc ) AS av ON av.userid = u.userid

qaru.site

sql - Этот запрос SQL требует вложенного запроса SELECT?

Вот что я до сих пор, но результаты ошибочны.

SELECT c.CompanyName, COUNT(o.OrderID) AS [Total Orders], SUM( (od.UnitPrice - (od.UnitPrice * od.Discount))* Quantity) AS [Purchase Total] FROM Customers AS c, Orders AS o, [Order Details] AS od WHERE c.CustomerID = o.CustomerID AND o.OrderID = od.OrderID GROUP BY c.CompanyName ORDER BY c.CompanyName;

Проблема, с которой я столкнулась, - это счет, он выключен двойным или более. Я считаю, что это связано с тем, что OrderID появляется несколько раз в таблице "Сведения о заказе". Я думаю, мне нужен вложенный оператор SELECT, но я не уверен, как это сделать.

Удаляю ли я выражение SUM(), информацию о заказе и предложение AND из первого запроса? Или я в отъезде?

С помощью я получил поле COUNT для работы, но теперь мое поле SUM ошибочно. Это моя самая последняя попытка, и она дает одинаковое значение для каждого клиента.

SELECT c.CompanyName, COUNT(o.OrderID) AS [Total Orders], (SELECT SUM( (odIN.UnitPrice - (odIN.UnitPrice * odIN.Discount)) * odIN.Quantity) AS [OrderTotal] FROM [Order Details] AS odIN, Orders As oIN WHERE odIN.OrderID = oIN.OrderID) AS [Purchase Total] FROM Customers AS c, Orders AS o WHERE c.CustomerID = o.CustomerID GROUP BY c.CompanyName ORDER BY c.CompanyName;

Мне не удалось получить запрос, чтобы он полностью работал так, как я этого хотел. Тогда я понял, что, может быть, я искал неправильные данные. Поэтому я переключил имя для поля COUNT на Num Products Purchased.

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

Спасибо за ваши попытки помочь.

qaru.site

Разделить запрос SQL во вложенный запрос (подзапрос) MS SQL Server

Изменить: добавьте все столбцы из

Возможно, я больше не могу редактировать свой комментарий, но это должно сделать трюк для второго запроса:

SELECT a.* , "AM-Martin_bin".dbo.CpCore_Image.Bytes FROM ( SELECT DISTINCT "AM-Martin".dbo.CpCore_Site.Number , "AM-Martin".dbo.CpCore_Site.Latitude , "AM-Martin".dbo.CpCore_Site.Longitude , "AM-Martin".dbo.CpSm_Face.RetiredOn , "AM-Martin".dbo.CpCore_Site.Name , "AM-Martin".dbo.CpCore_Site.Zipcode , "AM-Martin".dbo.CpSm_Face.Oid FROM "AM-Martin".dbo.CpCore_Site INNER JOIN "AM-Martin".dbo.CpSm_Face on "AM-Martin".dbo.CpSm_Face.SiteId = "AM-Martin".dbo.CpCore_Site.Oid WHERE "AM-Martin".dbo.CpSm_Face.RetiredOn LIKE '%9999%' AND "AM-Martin".dbo.CpCore_Site.Number LIKE N'%LA%' OR "AM-Martin".dbo.CpCore_Site.Number LIKE N'%LC%' OR "AM-Martin".dbo.CpCore_Site.Number LIKE N'%BH%' AND "AM-Martin".dbo.CpCore_Site.Latitude > 0.0 ) AS a INNER JOIN "AM-Martin_bin".dbo.CpCore_Image on a.Oid = "AM-Martin_bin".dbo.CpCore_Image.OwnerId;

Примечание. Я удалил GROUP BY из внутреннего запроса и вместо этого добавил DISTINCT, чтобы избавиться от возможных дубликатов. Однако я не могу проверить, будет ли это работать, поскольку я не знаю ваших данных.

Для удобства чтения я бы рекомендовал вам использовать псевдонимы ваших таблиц, а не повторять всю часть "AM-MARTIN".dbo.<tablename> (что первоначально меня отбросило с точки зрения поиска правильных столбцов и т. Д.).

Пример:

SELECT a.* , b.Bytes FROM ( SELECT DISTINCT a_inner.Number , a_inner.Latitude , a_inner.Longitude , b_inner.RetiredOn , "a_inner.Name , a_inner.Zipcode , b_inner.Oid FROM "AM-Martin".dbo.CpCore_Site a_inner INNER JOIN "AM-Martin".dbo.CpSm_Face b_inner on b_inner.SiteId = a_inner.Oid WHERE b_inner.RetiredOn LIKE '%9999%' AND b_inner.Number LIKE N'%LA%' OR b_inner.Number LIKE N'%LC%' OR b_inner.Number LIKE N'%BH%' AND b_inner.Latitude > 0.0 ) AS a INNER JOIN "AM-Martin_bin".dbo.CpCore_Image b on a.Oid = b.OwnerId;

Обратите внимание, что я использовал псевдонимы a_inner и b_inner для подзапроса. Однако вы могли бы просто использовать a и b . Я очень хотел убедиться, что вы увидите разницу, вместо того, чтобы задаваться вопросом, откуда идут столбцы.

sqlserver.bilee.com

Вложенные запросы в SQL Безопасный SQL

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

Вот мой запрос:

SELECT country.name as country, (SELECT country.headofstate from country where country.headofstate like 'A%') from country, city where city.population > 100000;

Я попытался изменить его, поместив в предложение where и т. Д. Я не получаю вложенные запросы. Я просто возвращаю ошибки, например, «subquery возвращает более одной строки» и т. Д. Если кто-то может помочь мне в том, как его заказать, и объяснить, почему это должно быть определенным образом, это было бы здорово.

Solutions Collecting From Web of "Вложенные запросы в SQL"

Если он должен быть «вложенным», это будет одним из способов, чтобы выполнить вашу работу:

SELECT o.name AS country, o.headofstate FROM country o WHERE o.headofstate like 'A%' AND ( SELECT i.population FROM city i WHERE i.id = o.capital ) > 100000

Однако JOIN будет более эффективным, чем коррелированный подзапрос. Неужели тот, кто когда-либо давал вам эту задачу, не в состоянии ускорить себя?

Вам нужно join к двум таблицам, а затем отфильтровать результат в where :

SELECT country.name as country, country.headofstate from country inner join city on city.id = country.capital where city.population > 100000 and country.headofstate like 'A%'

Запрос ниже должен помочь вам достичь того, чего вы хотите.

select scountry, headofstate from data where data.scountry like 'a%'and ttlppl>=100000

То, как я это вижу, единственное место для вложенного запроса будет в предложении WHERE, поэтому, например,

SELECT country.name, country.headofstate FROM country WHERE country.headofstate LIKE 'A%' AND country.id in (SELECT country_id FROM city WHERE population > 100000)

Кроме того, я должен согласиться с Адрианом: почему, черт возьми, вы должны использовать вложенные запросы?

sql.fliplinux.com

php - SQL Вложенный запрос вставки

Сегодня у меня есть база данных с 3 запросами для статистики в тестовых окнах. Я использую php для создания веб-сайта, но запросы выполняются слишком долго, поэтому я не могу показать полную статистику сайта, как я этого не сделал. Так как сейчас база данных обновляется редко в пакетах, поэтому я могу создавать события, которые ежедневно обновляют базы данных ежедневно/еженедельно.

У меня есть следующие 3 запроса сегодня, чтобы отобразить информацию, которую я хочу:

SELECT key FROM testcase GROUP BY key;

Это дает мне список с int из 4-10 групп тестов. скажем, 1,2,3,4 для аргумента. Затем я повторяю это в подзапросах как ключ, чтобы получить количество пройденных тестов, а количество тестов не прошло со следующими двумя запросами:

SELECT COUNT(*) AS passed FROM testcase INNER JOIN testcases ON testcase.ID = testcases.testcaseid WHERE pass = 1 AND key = %value%;

а также

SELECT COUNT(*) AS failed FROM testcase INNER JOIN testcases ON testcase.ID = testcases.testcaseid WHERE pass = 0 AND key = %value%;

вот как это работает сегодня. Запросы занимают около 25-30 секунд для каждого ключа и это делает тайм-аут сайта. (% value% - псевдокод для текущего значения из цикла for)

Вместо этого я думал о sql-запросе, который добавил это в таблицу базы данных, которая состоит из таблиц "ключ", "проход", "сбой", которые я заполняю ежедневно/еженедельно, чтобы показывать на сайте статистику. Я видел некоторые случаи, когда вы можете выполнять итерацию с помощью подзапроса, но поскольку 2 выполненных запроса являются противоположностями, я не вижу никакого решения для этого.

Я попытался индексировать значения, которые я использую в запросах, без успеха (что также может быть ошибочным).

//Андреас (начинающий SQL)

Редактировать:

О, дилемма, где, чтобы установить решение, я сделал комбинат от Гордона и Джо, чтобы сделать быстрый запрос, который работал как шарм:

INSERT INTO statistics (key,passed,failed) SELECT key, SUM(case when T.pass = 1 then T.matches else 0 end) as passed, SUM(case when T.pass = 0 then T.matches else 0 end) as failed FROM (SELECT key,pass,COUNT(*) AS matches FROM testcase INNER JOIN testcases ON testcase.ID = testcases.testcaseid GROUP BY key,pass)T GROUP BY key

qaru.site

sql - SQL Server: вложенный запрос выбора

У меня есть SQL-запрос, возвращающий результаты на основе предложения where.

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

Мой выбор возвращает строки с идентификатором, который соответствует критериям. Случается, что в таблице больше строк с этим идентификатором, но это не соответствует исходным критериям. Вместо того, чтобы повторно запрашивать БД отдельным вызовом, я хотел бы использовать один оператор select, чтобы также получить эти дополнительные строки с тем же идентификатором. ID не является индексом/идентификатором. Это соглашение об именах, которое я использую здесь.

Псевдо: (два шага)

1: select * from table where condition=xxx 2: for each row returned, (select * from table where id=row.id)

Я хочу делать:

select id as thisID, field1, field2, (select id, field1, field2 from table where id = thisID) from table where condition=xxx

У меня есть несколько объединений в моем реальном запросе, и просто не могу заставить выше работать. К сожалению, я не могу предоставить реальный запрос, но я получаю сообщение об ошибке:

В списке выбора может быть указано только одно выражение, если подзапрос не вводится с EXISTS. Недопустимое имя столбца 'thisID'

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

Пример:

ТАБЛИЦА

select * from table where col3 = 'green' id, col1, col2, col3 123 | blue | red | green ------------------------- 567 | blue | red | green ------------------------- 123 | blue | red | blue ------------------------- 890 | blue | red | green -------------------------

Я хочу вернуть все 4 строки, потому что хотя row 3 терпит неудачу при условии where, она имеет то же значение col1 что и row 1 (123), и мне нужно включить ее, поскольку она является частью "набора", который мне нужно найти/импортировать, вызывать/ссылаться на id=123.

То, что я делаю вручную сейчас, получает строку 1, а затем запускает другой запрос на основе идентификатора строки 1, чтобы получить строку 3.

qaru.site