Tengo dos mesas:
TableA
------
ID,
Name
TableB
------
ID,
SomeColumn,
TableA_ID (FK for TableA)
La relación es una fila de TableA
- muchas de TableB
.
Ahora, quiero ver un resultado como este:
ID Name SomeColumn
1. ABC X, Y, Z (these are three different rows)
2. MNO R, S
Esto no funcionará (varios resultados en una subconsulta):
SELECT ID,
Name,
(SELECT SomeColumn FROM TableB WHERE F_ID=TableA.ID)
FROM TableA
Este es un problema trivial si hago el procesamiento del lado del cliente. Pero esto significa que tendré que ejecutar X consultas en cada página, donde X es el número de resultados de TableA
.
Tenga en cuenta que no puedo simplemente hacer un GROUP BY o algo similar, ya que devolverá múltiples resultados para las filas de TableA
.
No estoy seguro de si una UDF, utilizando COALESCE o algo similar podría funcionar.
sql-server
tsql
join
Donnie Thomas
fuente
fuente
1. Cree la 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. Usar en subconsulta:
SELECT ID, Name, dbo.CombineValues(FK_ID) FROM TableA
3. Si está utilizando un procedimiento almacenado, puede hacer lo siguiente:
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
fuente
Creo que estás en el camino correcto con COALESCE. Vea aquí un ejemplo de cómo construir una cadena delimitada por comas:
http://www.sqlteam.com/article/using-coalesce-to-build-comma-delimited-string
fuente
En MySQL hay una función group_concat que devolverá lo que está pidiendo.
SELECT TableA.ID, TableA.Name, group_concat(TableB.SomeColumn) as SomColumnGroup FROM TableA LEFT JOIN TableB ON TableB.TableA_ID = TableA.ID
fuente
Es posible que deba proporcionar algunos detalles más para obtener una respuesta más precisa.
Dado que su conjunto de datos parece un poco estrecho, podría considerar usar una fila por resultado y realizar el posprocesamiento en el cliente.
Entonces, si realmente está buscando que el servidor haga el trabajo, devuelva un conjunto de resultados como
que por supuesto es un INNER JOIN en ID
Una vez que tenga el conjunto de resultados en el cliente, mantenga una variable llamada CurrentName y úsela como un disparador cuando deje de recopilar SomeColumn en lo útil que desea que haga.
fuente
Suponiendo que solo tiene cláusulas WHERE en la tabla A, cree un procedimiento almacenado así:
SELECT Id, Name From tableA WHERE ... SELECT tableA.Id AS ParentId, Somecolumn FROM tableA INNER JOIN tableB on TableA.Id = TableB.F_Id WHERE ...
Luego llene un DataSet ds con él. Entonces
Finalmente puede agregar un repetidor en la página que ponga comas para cada línea
<asp:DataList ID="Subcategories" DataKeyField="ParentCatId" DataSource='<%# Container.DataItem.CreateChildView("foo") %>' RepeatColumns="1" RepeatDirection="Horizontal" ItemStyle-HorizontalAlign="left" ItemStyle-VerticalAlign="top" runat="server" >
De esta manera lo hará del lado del cliente pero con una sola consulta, pasando datos mínimos entre la base de datos y el frontend
fuente
Probé la solución que priyanka.sarkar mencionó y no logré que funcionara como pidió el OP. Aquí está la solución con la que terminé:
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
fuente
Solución a continuación:
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
Use esto, también puede cambiar las Uniones
fuente
SELECT t.ID, t.NAME, (SELECT t1.SOMECOLUMN FROM TABLEB t1 WHERE t1.F_ID = T.TABLEA.ID) FROM TABLEA t;
Esto funcionará para seleccionar de una tabla diferente usando una subconsulta.
fuente
He revisado todas las respuestas. Creo que la inserción de la base de datos debería ser como:
La coma debe estar al final anterior y hacer la búsqueda por like
%,X,%
fuente