2016-08-09 33 views
0

Ich habe die folgende Tabelle Tabelle 1:Sql verknüpft andere Tabellen als eine Spalte

id │ value_one │ 
───┼───────────┼ 
1 │ a   │   
2 │ b   │  

Table2:

id │ value_two │ table1_id │ value_three 
───┼───────────┼───────────┼─────── 
1 │ a1  │ 1   │ a2 
2 │ b1  │ 1   │ b2 

Ich mag Ergebnis zu erhalten, wie unten die tables2 binden, die in Liste 1 table1_id = als Spalte

Welche SQL (SQL Server) Abfrage sollte ich verwenden?


@@ Sorry, ich ... azur SQL-Datenbank .....

(Azure SQL-Datenbank V12 hat ihre Kompatibilität Ebene beginnt bei 130, das entspricht Microsoft SQL Server 2016 GA.)

und wollen Abfrage String in Nodejs verwenden.

var queryString = ""; 
var query = { 
    sql: queryString 
}; 
req.azureMobile.data.execute(query) 
+3

Keine SQL-Abfrage wird JSON zurückgeben, außer Sie fragen speziell nach SQL Server 2016. Sie müssen * Code * schreiben, die Abfrageergebnisse nimmt und sie zu JSON –

+0

@PanagiotisKanavos serialisiert - ich lese fast das als eine Empfehlung für "NoSQL". https://en.wikipedia.org/wiki/NoSQL – Alec

+0

Scheint wie FOR JSON PATH ... Was ist Ihre SQL Server-Version? –

Antwort

0

Ich habe Möglichkeit Lösung in SQL Server 2016 zu testen, aber man kann es in früheren Versionen von SQL Server wie folgt vor:

WITH Table1 AS 
(
    SELECT * FROM (VALUES 
    (1, 'a'), 
    (2, 'b')) T(id, value_one) 
), Table2 AS 
(
    SELECT * FROM (VALUES 
    (1, 'a1', 1, 'a2'), 
    (2, 'b1', 1, 'b2') 
    ) T(id, value_two, table1_id, value_three) 
), RowValues AS 
(
    SELECT '{"value_one":'+QUOTENAME(value_one, '"')+',"from_table2":['+ 
     STUFF((SELECT ',{"value_two":'+QUOTENAME(value_two, '"')+',"value_three":'+QUOTENAME(value_three, '"')+'}' 
     FROM Table2 
     WHERE T1.id=table1_id 
     FOR XML PATH('')), 1, 1, '') 
     +']}' RowValue 
    FROM Table1 T1 
) 
SELECT * 
FROM RowValues 
WHERE RowValue IS NOT NULL 

Es produziert:

{"value_one":"a","from_table2":[{"value_two":"a1","value_three":"a2"},{"value_two":"b1","value_three":"b2"}]} 

SQL Server 2016, FÜR JSON

WITH Table1 AS 
(
    SELECT * FROM (VALUES 
    (1, 'a'), 
    (2, 'b') 
    ) T(id, value_one) 
), Table2 AS 
(
    SELECT * FROM (VALUES 
    (1, 'a1', 1, 'a2'), 
    (2, 'b1', 1, 'b2') 
    ) T(id, value_two, table1_id, value_three) 
) 
SELECT R FROM Table1 T1 
CROSS APPLY 
(
    SELECT T1.value_one, 
     (SELECT value_two, value_three FROM Table2 WHERE table1_id=T1.id FOR JSON PATH) fromTable2 
    FOR JSON PATH, WITHOUT_ARRAY_WRAPPER 
) T(R) 
--WHERE id=1--optional filter 

Es wäre einfacher, das ganze Ergebnis als ein JSON zu betrachten, aber es scheint gegen Ihre Annahmen zu sein.

Verwandte Themen