Вложенные записи - это sql server - PullRequest
0 голосов
/ 16 декабря 2008
select Table1.colID, Table1.colName, 
(select * from Table2 where Table2.colID = Table1.colID) as NestedRows
from Table1

Приведенный выше запрос дает вам эту ошибку: Подзапрос вернул более 1 значения. Это недопустимо, если подзапрос следует =,! =, <, <=,>,> = Или когда подзапрос используется .....

Кто-нибудь может объяснить, почему существует это ограничение?

У меня была идея, что такого рода многомерные запросы были бы хороши для построения объектов OO непосредственно из базы данных с 1 запросом

EDIT:

Этот вопрос довольно теоретический. Чтобы решить эту задачу, я бы использовал объединение или просто сделал 2 запроса, но мне было интересно, не мешало ли вам что-либо возвращать столбец как тип таблицы (в SQL Server 2008 вы можете создавать типы таблиц).

Скажем, у вас есть соответствующие классы в коде, подумайте, Linq2Sql

public class Table1
{
  public int colID,
  public string colName,
  public List<Table2> table2s;
}

Я бы хотел иметь возможность заполнять экземпляры этого класса напрямую одним запросом

Ответы [ 4 ]

3 голосов
/ 16 декабря 2008

Кажется, что вы хотите, чтобы набор записей (несколько столбцов и несколько строк) возвращался из таблицы 2 для каждой строки в таблице 1. Если это правильно, возможно, вы могли бы вернуть данные в виде XML из БД. Как то так ...

select Table1.colID, Table1.colName, Table2.*
from   Table1
       Inner Join Table2
         On Table1.ColId = Table2.ColId
Order By Table1.ColId
For XML Auto

Затем для каждой строки в таблице 1 вы получите несколько подузлов в вашем XML для данных таблицы 2.

Вероятно, это повлияет на производительность при возврате XML из вашей базы данных, а также при загрузке структуры данных на внешний интерфейс. Я не обязательно предполагаю, что это лучший подход, но, вероятно, стоит изучить.

2 голосов
/ 16 декабря 2008

Поскольку подзапрос в предложении select должен быть «вставлен» в значение столбца в каждой строке набора результатов из внешнего запроса. Вы не можете поместить набор значений в одну ячейку (один столбец одной строки) набора результатов.

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

0 голосов
/ 16 декабря 2008

Я думаю, что вы, вероятно, ищете запрос:

select Table1.colID, Table1.colName,Table2.*
from Table1 inner join Table2 ON Table1.colID = Table2.colID

Подзапросы чаще используются (по крайней мере, мной) в предложении WHERE.

0 голосов
/ 16 декабря 2008

Вам лучше использовать INNER JOIN между двумя таблицами и просто выбирать нужные строки из каждой таблицы.

SELECT tab1.colID, tab1.colName, tab2.Column1, tab2.column2
FROM dbo.Table1 AS tab1
    INNER JOIN dbo.Table2 AS tab2
        ON tab1.colID = tab2.colID

Однако помните, что данные из таблицы1 будут повторяться для каждой соответствующей записи в таблице2. Хотя я полагаю, что отправленный запрос получит данные в той форме, которую вы ищете, но я не думаю, что это лучший метод для запроса базы данных. Я либо выполняю отдельные запросы, либо помещаю отдельные запросы в хранимую процедуру и возвращаю несколько наборов результатов.

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