У меня есть две таблицы:
TableA
------
ID,
Name
TableB
------
ID,
SomeColumn,
TableA_ID (FK for TableA)
Отношения - это один ряд TableA
- много таких TableB
.
Теперь я хочу увидеть такой результат:
ID Name SomeColumn
1. ABC X, Y, Z (these are three different rows)
2. MNO R, S
Это не сработает (несколько результатов в подзапросе):
SELECT ID,
Name,
(SELECT SomeColumn FROM TableB WHERE F_ID=TableA.ID)
FROM TableA
Это тривиальная проблема, если я выполняю обработку на стороне клиента. Но это будет означать, что мне придется выполнять X запросов на каждой странице, где X - это количество результатов TableA
.
Обратите внимание, что я не могу просто выполнить GROUP BY или что-то подобное, так как он вернет несколько результатов для строк TableA
.
Я не уверен, может ли работать UDF, использующий COALESCE или что-то подобное?
sql-server
tsql
join
Донни Томас
источник
источник
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
источник
Я думаю, что с COALESCE вы на правильном пути. См. Здесь пример построения строки с разделителями-запятыми:
http://www.sqlteam.com/article/using-coalesce-to-build-comma-delimited-string
источник
В 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
источник
Возможно, вам потребуется предоставить более подробную информацию для более точного ответа.
Поскольку ваш набор данных кажется узким, вы можете просто использовать строку для каждого результата и выполнять постобработку на клиенте.
Итак, если вы действительно хотите, чтобы сервер выполнял работу, верните набор результатов, например
что, конечно же, является простым INNER JOIN по ID
После того, как вы получите набор результатов обратно на клиенте, сохраните переменную с именем CurrentName и используйте ее в качестве триггера, когда следует прекратить сбор SomeColumn в полезную вещь, которую вы хотите.
источник
Предполагая, что у вас есть только предложения 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. потом
Наконец, вы можете добавить на страницу повторитель, который ставит запятые для каждой строки
<asp:DataList ID="Subcategories" DataKeyField="ParentCatId" DataSource='<%# Container.DataItem.CreateChildView("foo") %>' RepeatColumns="1" RepeatDirection="Horizontal" ItemStyle-HorizontalAlign="left" ItemStyle-VerticalAlign="top" runat="server" >
Таким образом, вы сделаете это на стороне клиента, но с помощью только одного запроса, передав минимальные данные между базой данных и внешним интерфейсом.
источник
Я попробовал решение, упомянутое priyanka.sarkar, и оно не совсем заработало, как попросил OP. Вот решение, к которому я пришел:
SELECT ID, SUBSTRING(( SELECT ',' + T2.SomeColumn FROM @T T2 WHERE WHERE T1.id = T2.id FOR XML PATH('')), 2, 1000000) FROM @T T1 GROUP BY ID
источник
Решение ниже:
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
Используйте это, вы также можете изменить присоединения
источник
SELECT t.ID, t.NAME, (SELECT t1.SOMECOLUMN FROM TABLEB t1 WHERE t1.F_ID = T.TABLEA.ID) FROM TABLEA t;
Это будет работать для выбора из другой таблицы с помощью подзапроса.
источник
Я просмотрел все ответы. Я думаю, что вставка базы данных должна быть такой:
Запятая должна быть в предыдущем конце и искать по подобию
%,X,%
источник