Объедините несколько результатов в подзапросе в единственное разделенное от запятой значение

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

80
задан Mark 15 March 2016 в 08:11
поделиться

7 ответов

1. Создайте UDF:

CREATE FUNCTION CombineValues
(
    @FK_ID INT -- The foreign key from TableA which is used 
               -- to fetch corresponding records
)
RETURNS VARCHAR(8000)
AS
BEGIN
DECLARE @SomeColumnList VARCHAR(8000);

SELECT @SomeColumnList =
    COALESCE(@SomeColumnList + ', ', '') + CAST(SomeColumn AS varchar(20)) 
FROM TableB C
WHERE C.FK_ID = @FK_ID;

RETURN 
(
    SELECT @SomeColumnList
)
END

2. Используйте в подзапросе:

SELECT ID, Name, dbo.CombineValues(FK_ID) FROM TableA

3. При использовании хранимой процедуры, можно сделать как это:

CREATE PROCEDURE GetCombinedValues
 @FK_ID int
As
BEGIN
DECLARE @SomeColumnList VARCHAR(800)
SELECT @SomeColumnList =
    COALESCE(@SomeColumnList + ', ', '') + CAST(SomeColumn AS varchar(20)) 
FROM TableB
WHERE FK_ID = @FK_ID 

Select *, @SomeColumnList as SelectedIds
    FROM 
        TableA
    WHERE 
        FK_ID = @FK_ID 
END
45
ответ дан 6 revs, 4 users 64% 24 November 2019 в 09:51
поделиться

Я думаю, что Вы на правильном пути с, ОБЪЕДИНЯЮТ. Посмотрите здесь для примера создания разграниченной запятой строки:

http://www.sqlteam.com/article/using-coalesce-to-build-comma-delimited-string

11
ответ дан Ben Hoffstein 24 November 2019 в 09:51
поделиться

В MySQL существует функция group_concat, которая возвратит то, что Вы просите.

SELECT TableA.ID, TableA.Name, group_concat(TableB.SomeColumn) 
as SomColumnGroup FROM TableA LEFT JOIN TableB ON 
TableB.TableA_ID = TableA.ID
10
ответ дан Jacob 24 November 2019 в 09:51
поделиться

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

, Так как Ваш набор данных кажется довольно узким, Вы могли бы рассмотреть просто использование строки на результат и выполнение последующей обработки в клиенте.

Поэтому, если Вы действительно надеетесь заставлять сервер сделать, работа возвращает набор результатов как

ID       Name       SomeColumn
1        ABC        X
1        ABC        Y
1        ABC        Z
2        MNO        R
2        MNO        S

, который, конечно, является простым ВНУТРЕННИМ ОБЪЕДИНЕНИЕМ на идентификаторе

, Как только Вы имеете набор результатов назад в клиенте, поддерживаете переменную под названием CurrentName и использование, которое как триггер, когда прекратить собирать SomeColumn в полезную вещь, Вы хотите, чтобы он сделал.

0
ответ дан Bill 24 November 2019 в 09:51
поделиться

Принятие Вас только имеет операторы Where на таблице A, создают хранимую процедуру таким образом:

SELECT Id, Name From tableA WHERE ...

SELECT tableA.Id AS ParentId, Somecolumn 
FROM tableA INNER JOIN tableB on TableA.Id = TableB.F_Id 
WHERE ...

Тогда заполняют DataSet ds им. Тогда

ds.Relations.Add("foo", ds.Tables[0].Columns("Id"), ds.Tables[1].Columns("ParentId"));

Наконец можно добавить повторитель на странице, которая помещает запятые для каждой строки

 <asp:DataList ID="Subcategories" DataKeyField="ParentCatId" 
DataSource='<%# Container.DataItem.CreateChildView("foo") %>' RepeatColumns="1"
 RepeatDirection="Horizontal" ItemStyle-HorizontalAlign="left" ItemStyle-VerticalAlign="top" 
runat="server" >

Таким образом, Вы сделаете это сторона клиента, но только с одним запросом, передавая минимальные данные между базой данных и frontend

0
ответ дан Sklivvz 24 November 2019 в 09:51
поделиться

Даже это будет служить цели

Пример данных

declare @t table(id int, name varchar(20),somecolumn varchar(MAX))
insert into @t
    select 1,'ABC','X' union all
    select 1,'ABC','Y' union all
    select 1,'ABC','Z' union all
    select 2,'MNO','R' union all
    select 2,'MNO','S'

Запрос:

SELECT ID,Name,
    STUFF((SELECT ',' + CAST(T2.SomeColumn AS VARCHAR(MAX))
     FROM @T T2 WHERE T1.id = T2.id AND T1.name = T2.name
     FOR XML PATH('')),1,1,'') SOMECOLUMN
FROM @T T1
GROUP BY id,Name

Вывод:

ID  Name    SomeColumn
1   ABC     X,Y,Z
2   MNO     R,S
131
ответ дан 24 November 2019 в 09:51
поделиться

Решение ниже:

SELECT GROUP_CONCAT(field_attr_best_weekday_value)as RAVI
FROM content_field_attr_best_weekday LEFT JOIN content_type_attraction
    on content_field_attr_best_weekday.nid = content_type_attraction.nid
GROUP BY content_field_attr_best_weekday.nid

Используйте это, вы также можете изменить соединения

-1
ответ дан 24 November 2019 в 09:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: