Warum geben RDBMS keine verknüpften Tabellen in einem verschachtelten Format zurück?

14

Angenommen, ich möchte einen Benutzer und alle seine Telefonnummern und E-Mail-Adressen abrufen. Die Telefonnummern und E-Mails werden in separaten Tabellen gespeichert, Ein Benutzer zu vielen Telefonen / E-Mails. Das kann ich ganz einfach machen:

SELECT * FROM users user 
    LEFT JOIN emails email ON email.user_id=user.id
    LEFT JOIN phones phone ON phone.user_id=user.id

Das Problem * dabei ist, dass der Name des Benutzers, das DOB, die Lieblingsfarbe und alle anderen Informationen, die in der Benutzertabelle gespeichert sind, für jeden Datensatz immer wieder zurückgegeben werden (Benutzer sendet E- Mail-Telefondatensätze), was vermutlich die Bandbreite verschlingt und verlangsamt die Ergebnisse aufschreiben.

Wäre es nicht schöner, wenn für jeden Benutzer eine einzelne Zeile zurückgegeben würde und in diesem Datensatz eine Liste von E-Mails und eine Liste von Telefonen enthalten wäre? Dies würde die Arbeit mit den Daten erheblich erleichtern.

Ich weiß, dass Sie mit LINQ oder anderen Frameworks solche Ergebnisse erzielen können, aber es scheint eine Schwäche im zugrunde liegenden Design relationaler Datenbanken zu sein.

Wir könnten das mit NoSQL umgehen, aber sollte es keinen Mittelweg geben?

Vermisse ich etwas? Warum gibt es das nicht?

* Ja, es ist so konzipiert. Ich verstehe es. Ich frage mich, warum es keine Alternative gibt, mit der man einfacher arbeiten kann. SQL könnte weitermachen, was es tut, aber dann könnten sie ein oder zwei Schlüsselwörter hinzufügen, um ein bisschen Nachbearbeitung zu machen, die die Daten in einem verschachtelten Format anstelle eines kartesischen Produkts zurückgibt.

Ich weiß, dass dies in einer Skriptsprache Ihrer Wahl durchgeführt werden kann, aber es erfordert, dass der SQL Server entweder redundante Daten sendet (Beispiel unten) oder dass Sie mehrere Abfragen wie ausgeben SELECT email FROM emails WHERE user_id IN (/* result of first query */).


Anstatt MySQL so etwas zurückgeben zu lassen:

[
    {
        "name": "John Smith",
        "dob": "1945-05-13",
        "fav_color": "red",
        "email": "[email protected]",
    },
    {
        "name": "John Smith",
        "dob": "1945-05-13",
        "fav_color": "red",
        "email": "[email protected]",
    },
    {
        "name": "Jane Doe",
        "dob": "1953-02-19",
        "fav_color": "green",
        "email": "[email protected]",
    }
]

Und dann müssen Sie eine eindeutige ID gruppieren (was bedeutet, dass ich diese auch abrufen muss!), Um die Ergebnismenge nach Ihren Wünschen neu zu formatieren. Geben Sie einfach Folgendes zurück:

[
    {
        "name": "John Smith",
        "dob": "1945-05-13",
        "fav_color": "red",
        "emails": ["[email protected]", "[email protected]"]
    },
    {
        "name": "Jane Doe",
        "dob": "1953-02-19",
        "fav_color": "green",
        "emails": ["[email protected]"],
    }
]

Alternativ kann ich drei Abfragen ausführen: eine für die Benutzer, eine für die E-Mails und eine für die Telefonnummern. In den Ergebnismengen für E-Mail und Telefonnummer muss jedoch die user_id enthalten sein, damit ich sie wieder den Benutzern zuordnen kann Ich habe vorher geholt. Wieder redundante Daten und unnötige Nachbearbeitung.

mpen
quelle
6
Stellen Sie sich SQL wie eine Tabelle in Microsoft Excel vor und versuchen Sie dann herauszufinden, wie Sie einen Zellenwert erstellen, der innere Zellen enthält. Es funktioniert nicht mehr gut als Tabellenkalkulation. Was Sie suchen, ist eine Baumstruktur, aber dann haben Sie nicht mehr die Vorteile einer Tabellenkalkulation (dh Sie können keine Spalte in einem Baum summieren). Baumstrukturen sind keine für Menschen lesbaren Berichte.
Reactgular
54
SQL ist nicht schlecht darin, Daten zurückzugeben, Sie können schlecht fragen, was Sie wollen. Als Faustregel gilt, dass Sie das Problem sind, wenn Sie der Meinung sind, dass ein weit verbreitetes Werkzeug für einen allgemeinen Anwendungsfall fehlerhaft oder defekt ist.
Sean McSomething
12
@SeanMcSomething So wahr, dass es weh tut, ich hätte es selbst nicht besser sagen können.
WernerCD
5
Das sind tolle Fragen. Antworten, die sagen "das ist so wie es ist", haben keinen Sinn. Warum ist es nicht möglich, Zeilen mit eingebetteten Zeilensammlungen zurückzugeben?
Chris Pitman
8
@SeanMcSomething: Wenn dieses weit verbreitete Tool nicht C ++ oder PHP ist, haben Sie wahrscheinlich Recht. ;)
Mason Wheeler

Antworten:

11

Tief im Innern einer relationalen Datenbank befinden sich alle Zeilen und Spalten. Das ist die Struktur, mit der eine relationale Datenbank optimiert ist. Cursor bearbeiten jeweils einzelne Zeilen. Einige Operationen erstellen temporäre Tabellen (auch hier müssen es Zeilen und Spalten sein).

Wenn Sie nur mit Zeilen arbeiten und nur Zeilen zurückgeben, kann das System den Speicher- und Netzwerkverkehr besser verarbeiten.

Wie bereits erwähnt, können auf diese Weise bestimmte Optimierungen vorgenommen werden (Indizes, Verknüpfungen, Gewerkschaften usw.).

Wenn man eine verschachtelte Baumstruktur haben möchte, muss man alle Daten auf einmal ziehen. Vorbei sind die Optimierungen für die Cursor auf der Datenbankseite. Ebenso wird der Datenverkehr über das Netzwerk zu einem großen Burst, der viel länger dauern kann als das langsame Hin und Her von Zeile zu Zeile (dies geht in der heutigen Webwelt gelegentlich verloren).

Jede Sprache enthält Arrays. Dies sind einfache Dinge, mit denen man arbeiten und mit denen man interagieren kann. Durch die Verwendung einer sehr primitiven Struktur kann der Treiber zwischen Datenbank und Programm - egal in welcher Sprache - auf eine gemeinsame Weise funktionieren. Sobald man anfängt, Bäume hinzuzufügen, werden die Strukturen in der Sprache komplexer und schwerer zu durchqueren.

Für eine Programmiersprache ist es nicht so schwierig, die zurückgegebenen Zeilen in eine andere Struktur zu konvertieren. Machen Sie daraus einen Baum oder einen Hash-Satz oder lassen Sie ihn als Liste von Zeilen, über die Sie iterieren können.

Hier ist auch Geschichte am Werk. Die Übertragung strukturierter Daten war in früheren Zeiten etwas hässlich. Schauen Sie sich das EDI-Format an, um eine Vorstellung davon zu bekommen, wonach Sie fragen könnten. Bäume implizieren auch Rekursion - was einige Sprachen nicht unterstützten (die beiden wichtigsten Sprachen der alten Zeit unterstützten Rekursion nicht - Rekursion trat erst in Fortran auf, als F90 und in der Ära COBOL ebenfalls nicht).

Und obwohl die heutigen Sprachen Rekursion und fortgeschrittenere Datentypen unterstützen, gibt es keinen guten Grund, etwas zu ändern. Sie arbeiten und sie arbeiten gut. Diejenigen, die Dinge ändern, sind die NOSQL-Datenbanken. Sie können Bäume in Dokumenten in einem dokumentbasierten Dokument speichern. LDAP (es ist eigentlich altmodisch) ist auch ein baumbasiertes System (obwohl es wahrscheinlich nicht das ist, wonach Sie suchen). Wer weiß, vielleicht ist das nächste, was in NOSQL-Datenbanken passiert, eines, das die Abfrage als JSON-Objekt zurückgibt.

Die 'alten' relationalen Datenbanken arbeiten jedoch mit Zeilen, weil sie darin gut sind und alles ohne Probleme oder Übersetzung mit ihnen kommunizieren kann.

  1. Im Protokolldesign wurde Perfektion nicht erreicht, wenn nichts mehr hinzuzufügen ist, sondern wenn nichts mehr wegzunehmen ist.

Aus RFC 1925 - Die zwölf Wahrheiten der Vernetzung


quelle
"Wenn man eine verschachtelte Baumstruktur haben möchte, muss man alle Daten auf einmal abrufen. Die Optimierungen für die Cursor auf der Datenbankseite sind verschwunden." - Das klingt nicht wahr. Es müssten nur ein paar Cursor gepflegt werden: einer für die Haupttabelle und einer für jede verknüpfte Tabelle. Abhängig von der Schnittstelle wird möglicherweise eine Zeile und alle verknüpften Tabellen in einem Block (teilweise gestreamt) zurückgegeben, oder es werden die Unterstrukturen gestreamt (und möglicherweise nicht einmal abgefragt), bis Sie mit der Iteration beginnen. Aber ja, das macht die Dinge sehr kompliziert.
27.
3
Jede moderne Sprache sollte jedoch eine Art Baumklasse haben, oder? Und wäre es nicht Sache des Fahrers, sich darum zu kümmern? Ich denke, die SQL-Leute müssen noch ein gemeinsames Format entwerfen (wissen nicht viel darüber). Die Sache, die mich jedoch erwischt, ist, dass ich entweder 1 Abfrage mit Verknüpfungen senden und die redundanten Daten, die jede Zeile enthält (die Benutzerinformationen, die nur jede N-te Zeile ändern), zurückholen und herausfiltern oder 1 Abfrage (Benutzer) ausgeben muss. , und durchlaufen Sie die Ergebnisse, und senden Sie dann für jeden Datensatz zwei weitere Abfragen (E-Mails, Telefone), um die benötigten Informationen abzurufen. Beide Methoden scheinen verschwenderisch zu sein.
27.
51

Es wird genau das zurückgegeben, wonach Sie gefragt haben: ein einzelner Datensatz, der das durch die Joins definierte kartesische Produkt enthält. Es gibt viele gültige Szenarien, in denen genau das gewünscht wird. Wenn Sie also sagen, dass SQL ein schlechtes Ergebnis liefert (und damit impliziert, dass es besser wäre, wenn Sie es ändern), würden Sie tatsächlich eine Menge Abfragen vermasseln.

Was Sie erleben, ist als " Object / Relational Impedance Mismatch " bekannt, die technischen Schwierigkeiten, die sich aus der Tatsache ergeben, dass sich das objektorientierte Datenmodell und das relationale Datenmodell in verschiedener Hinsicht grundlegend unterscheiden. LINQ und andere Frameworks (bekannt als ORMs, Object / Relational Mappers, nicht zufällig) umgehen dies nicht auf magische Weise. Sie geben nur verschiedene Abfragen aus. Dies kann auch in SQL erfolgen. So würde ich es machen:

SELECT * FROM users user where [criteria here]

Durchlaufen Sie die Liste der Benutzer und erstellen Sie eine Liste der IDs.

SELECT * from EMAILS where user_id in (list of IDs here)
SELECT * from PHONES where user_id in (list of IDs here)

Und dann machst du den Beitritt clientseitig. So machen es LINQ und andere Frameworks. Es gibt keine wirkliche Magie. nur eine Abstraktionsebene.

Mason Wheeler
quelle
14
+1 für "genau das, wonach Sie gefragt haben". Zu oft kommen wir zu dem Schluss, dass etwas mit der Technologie nicht stimmt, statt zu dem Schluss, dass wir lernen müssen, wie man die Technologie effektiv einsetzt.
Matt
1
Der Ruhezustand ruft die Stammentität und bestimmte Sammlungen in einer einzigen Abfrage ab, wenn für diese Sammlungen der Modus " Eifriger Abruf" verwendet wird. In diesem Fall werden die Eigenschaften der Stammentität im Speicher reduziert. Andere ORMs können wahrscheinlich dasselbe tun.
Mike Partridge
3
Eigentlich liegt das nicht am relationalen Modell. Es kommt sehr gut mit verschachtelten Beziehungen zurecht. Danke. Dies ist lediglich ein Implementierungsfehler in früheren Versionen von SQL. Ich denke, neuere Versionen haben es allerdings hinzugefügt.
John Nilsson
8
Sind Sie sicher, dass dies ein Beispiel für eine objektrelationale Impedanz ist? Mir scheint, dass das relationale Modell perfekt zum konzeptionellen Datenmodell des OP passt: Jedem Benutzer ist eine Liste mit null, einer oder mehreren E-Mail-Adressen zugeordnet. Dieses Modell ist auch in einem OO-Paradigma perfekt verwendbar (Aggregation: Das Benutzerobjekt verfügt über eine Sammlung von E-Mails). Die Einschränkung liegt in der Technik, die zum Abfragen der Datenbank verwendet wird, die ein Implementierungsdetail darstellt. Es gibt Abfragetechniken, die heirarchische
MarkJ,
@MarkJ du solltest das als Antwort aufschreiben.
Mr.Mindor
12

Sie können eine integrierte Funktion verwenden, um die Datensätze miteinander zu verknüpfen. In MySQL können Sie die GROUP_CONCAT()Funktion verwenden und in Oracle können Sie die LISTAGG()Funktion verwenden.

Hier ist ein Beispiel, wie eine Abfrage in MySQL aussehen könnte:

SELECT user.*, 
    (SELECT GROUP_CONCAT(DISTINCT emailAddy) FROM emails email WHERE email.user_id = user.id
    ) AS EmailAddresses,
    (SELECT GROUP_CONCAT(DISTINCT phoneNumber) FROM phones phone WHERE phone.user_id = user.id
    ) AS PhoneNumbers
FROM users user 

Dies würde so etwas wie zurückgeben

username    department       EmailAddresses                        PhoneNumbers
Tim_Burton  Human Resources  hr@m.com, tb@me.com, nunya@what.com   231-123-1234, 231-123-1235
Verweilen
quelle
Dies scheint die Lösung zu sein, die dem, was das OP versucht, am nächsten kommt (in SQL). Möglicherweise muss er noch clientseitige Verarbeitung durchführen, um die Ergebnisse von EmailAddresses und PhoneNumbers in Listen aufzuteilen.
Mr.Mindor
2
Was ist, wenn die Telefonnummer einen "Typ" wie "Handy", "Privat" oder "Arbeit" hat? Außerdem sind Kommas in E-Mail-Adressen technisch zulässig (wenn sie in Anführungszeichen stehen). Wie würde ich sie dann aufteilen?
28.
10

Das Problem dabei ist, dass der Name des Benutzers, das Geburtsdatum, die Lieblingsfarbe und alle anderen gespeicherten Informationen zurückgegeben werden

Das Problem ist, dass Sie nicht selektiv genug sind. Sie haben um alles gebeten, als Sie sagten

Select * from...

... und Sie haben es bekommen (einschließlich DOB und Lieblingsfarben).

Du solltest wahrscheinlich ein bisschen selektiver sein und so etwas sagen wie:

select users.name, emails.email_address, phones.home_phone, phones.bus_phone
from...

Es ist auch möglich, dass Sie Datensätze sehen, die wie Duplikate aussehen, da ein userDatensatz möglicherweise mit mehreren emailDatensätzen verknüpft wird, das Feld, das diese beiden voneinander unterscheidet, jedoch nicht in Ihrer SelectAnweisung enthalten ist

select distinct users.name, emails.email_address, phones.home_phone, phones.bus_phone
from...

... immer und immer wieder für jede Platte ...

Ich stelle auch fest, dass Sie eine LEFT JOIN. Dies verbindet alle Datensätze links vom Join (dh users) mit allen Datensätzen rechts, oder mit anderen Worten:

Ein linker äußerer Join gibt alle Werte aus einem inneren Join sowie alle Werte in der linken Tabelle zurück, die nicht mit der rechten Tabelle übereinstimmen.

( http://en.wikipedia.org/wiki/Join_(SQL)#Left_outer_join )

Eine andere Frage ist also, ob Sie tatsächlich eine linke Verknüpfung benötigen oder ob eine INNER JOINausreichend gewesen wäre. Es sind sehr unterschiedliche Arten von Verknüpfungen.

Wäre nicht schöner, wenn es für jeden Benutzer eine einzelne Zeile gäbe und in diesem Datensatz eine Liste von E-Mails enthalten wäre

Wenn Sie tatsächlich möchten, dass eine einzelne Spalte in der Ergebnismenge eine Liste enthält, die im laufenden Betrieb generiert wird, können Sie dies tun, dies hängt jedoch von der verwendeten Datenbank ab. Oracle hat die listaggFunktion .


Letztendlich denke ich, dass Ihr Problem gelöst werden könnte , wenn Sie Ihre Abfrage in etwa so umschreiben:

select distinct users.name, users.id, emails.email_address, phones.phone_number
from users
  inner join emails on users.user_id = emails.user_id
  inner join phones on users.user_id = phones.user_id
FrustratedWithFormsDesigner
quelle
1
von der Verwendung von * wird abgeraten, jedoch nicht der springende Punkt seines Problems. Selbst wenn er 0 Benutzerspalten auswählt, kann es dennoch zu einem Duplizierungseffekt kommen, da sowohl Telefone als auch E-Mails eine 1: 1-Beziehung zu Benutzern haben. Distinct würde nicht verhindern, dass eine Telefonnummer zweimal vorkommt, beispielsweise phone1/[email protected], phone1/[email protected].
mike30
6
-1: "Ihr Problem ist möglicherweise gelöst" besagt, dass Sie nicht wissen, von welchem ​​Effekt die Änderung left joinauf erfolgt inner join. In diesem Fall werden die "Wiederholungen", über die sich der Benutzer beschwert, nicht verringert. Benutzer, denen ein Telefon oder eine E-Mail fehlt, werden einfach weggelassen. kaum Besserung. Außerdem werden bei der Interpretation von "Alle Datensätze links vor allen Datensätzen rechts" die ONKriterien übersprungen , wodurch alle dem kartesischen Produkt innewohnenden "falschen" Beziehungen entfernt werden, aber alle wiederholten Felder beibehalten werden.
Javier
@Javier: Ja, deswegen habe ich auch gesagt, brauchst du eigentlich einen linken Join, oder wäre ein INNER JOIN ausreichend gewesen? * OPs Beschreibung des Problems lässt es klingen, als hätten sie das Ergebnis einer inneren Verbindung erwartet. Ohne Beispieldaten oder eine Beschreibung dessen, was sie wirklich wollten, ist es natürlich schwer zu sagen. Ich habe den Vorschlag gemacht, weil ich tatsächlich gesehen habe, wie Leute (mit denen ich arbeite) dies tun: Wählen Sie den falschen Join und beschweren Sie sich dann, wenn sie die Ergebnisse, die sie erhalten, nicht verstehen. Nachdem ich es gesehen hatte, dachte ich, dass es hier passiert sein könnte.
FrustratedWithFormsDesigner
3
Sie verpassen den Punkt der Frage. In diesem hypothetischen Beispiel möchte ich alle Benutzerdaten (Name, Name usw.) und alle seine Telefonnummern. Ein innerer Join schließt Benutzer ohne E-Mails oder ohne Telefon aus - wie hilft das?
25.
4

Abfragen erzeugen immer eine rechteckige (nicht gezackte) tabellarische Datenmenge. Es gibt keine verschachtelten Untermengen innerhalb einer Menge. In der Welt der Mengen ist alles ein reines, nicht verschachteltes Rechteck.

Sie können sich einen Join vorstellen, indem Sie zwei Sätze nebeneinander platzieren. Die Bedingung "Ein" ist, wie die Datensätze in jedem Satz abgeglichen werden. Wenn ein Benutzer 3 Telefonnummern hat, wird in den Benutzerinformationen eine dreimalige Verdoppelung angezeigt. Von der Abfrage muss eine rechteckige, nicht gezackte Menge erstellt werden. Es liegt einfach in der Natur des Verbindens von Sets mit einer 1-zu-viele-Beziehung.

Um das zu bekommen, was Sie wollen, müssen Sie eine separate Abfrage wie die von Mason Wheeler beschriebene verwenden.

select * from Phones where user_id=344;

Das Ergebnis dieser Abfrage ist immer noch eine rechteckige, nicht gezackte Menge. Wie alles in der Welt der Sets.

mike30
quelle
2

Sie müssen entscheiden, wo die Engpässe bestehen. Die Bandbreite zwischen Ihrer Datenbank und der Anwendung ist normalerweise ziemlich schnell. Es gibt keinen Grund, warum die meisten Datenbanken nicht drei separate Datensätze innerhalb eines Aufrufs und keine Verknüpfungen zurückgeben konnten. Dann können Sie alles in Ihrer App zusammenfügen, wenn Sie möchten.

Andernfalls möchten Sie, dass die Datenbank diesen Datensatz zusammenstellt und dann alle wiederholten Werte in jeder Zeile entfernt, die das Ergebnis der Verknüpfungen sind, und nicht unbedingt, dass die Zeilen selbst doppelte Daten enthalten, z. B. zwei Personen mit demselben Namen oder derselben Telefonnummer. Scheint viel Overhead zu sein, um Bandbreite zu sparen. Sie sollten sich besser darauf konzentrieren, weniger Daten mit einer besseren Filterung zurückzugeben und die nicht benötigten Spalten zu entfernen. Weil Select * nie in der Produktion verwendet wird - das hängt davon ab.

JeffO
quelle
"Es gibt keinen Grund, warum die meisten Datenbanken nicht drei separate Datensätze innerhalb eines Aufrufs und keine Verknüpfungen zurückgeben konnten" - Wie können Sie dafür sorgen, dass drei separate Datensätze mit einem Aufruf zurückgegeben werden? Ich dachte, Sie müssten 3 verschiedene Abfragen senden, was die Latenz zwischen den einzelnen einführt?
26.
Eine gespeicherte Prozedur kann in einer Transaktion aufgerufen werden und dann so viele Datensätze zurückgeben, wie Sie möchten. Möglicherweise wird ein "SelectUserWithEmailsPhones" -Sproc benötigt.
Graham
1
@Mark: Sie können (mindestens in SQL Server) mehr als einen Befehl als Teil desselben Stapels senden. cmdText = "wähle * aus b; wähle * aus a; wähle * aus c" und verwende diesen als Befehlstext für den Befehl sql.
Jmoreno
2

Verbinden Sie Ihre Daten ganz einfach nicht, wenn Sie eindeutige Ergebnisse für eine Benutzer- und eine Telefonnummernabfrage wünschen. Anderenfalls enthalten die Daten, wie bereits erwähnt, zusätzliche Felder für jede Zeile.

Geben Sie zwei unterschiedliche Abfragen aus, anstatt eine mit einem Join.

In der gespeicherten Prozedur oder in der Inline-Parametrisierung fragt sql craft 2 ab und gibt die Ergebnisse beider zurück. Die meisten Datenbanken und Sprachen unterstützen mehrere Ergebnismengen.

Beispielsweise führen SQL Server und C # diese Funktionen mithilfe von aus IDataReader.NextResult().

Jon Raynor
quelle
1

Ihnen fehlt etwas. Wenn Sie Ihre Daten denormalisieren möchten, müssen Sie dies selbst tun.

;with toList as (
    select  *, Stuff(( select ',' + (phone.phoneType + ':' + phone.PhoneNumber) 
                    from phones phone
                    where phone.user_id = user.user_id
                    for xml path('')
                  ), 1,1,'') as phoneNumbers
from users user
)
select *
from toList
jmoreno
quelle
1

Das Konzept von relationalen Abschlusses bedeutet im Grunde, dass das Ergebnis jeder Abfrage eine Beziehung ist, die in anderen Abfragen verwendet werden kann, als wäre es eine Basistabelle. Dies ist ein leistungsfähiges Konzept, da es Abfragen zusammensetzbar macht.

Wenn Sie mit SQL Abfragen schreiben könnten, die verschachtelte Datenstrukturen ausgeben, würden Sie dieses Prinzip brechen. Eine verschachtelte Datenstruktur ist keine Relation. Sie benötigen daher eine neue Abfragesprache oder komplexe Erweiterungen für SQL, um sie weiter abzufragen oder um sie mit anderen Relationen zu verknüpfen.

Grundsätzlich würden Sie ein hierarchisches DBMS auf einem relationalen DBMS aufbauen. Für einen zweifelhaften Vorteil wird es viel komplexer, und Sie verlieren die Vorteile eines konsistenten relationalen Systems.

Ich verstehe, warum es manchmal bequem ist, hierarchisch strukturierte Daten aus SQL auszugeben, aber die Kosten für die zusätzliche Komplexität im gesamten DBMS, um dies zu unterstützen, sind es definitiv nicht wert.

JacquesB
quelle
-4

Pls beziehen sich auf die Verwendung der Funktion STUFF, die mehrere Zeilen (Telefonnummern) einer Spalte (Kontakt) gruppiert, die als einzelne Zelle mit begrenzten Werten einer Zeile (Benutzer) extrahiert werden können.

Heute nutzen wir dies ausgiebig, haben jedoch einige Probleme mit der CPU und der Leistung. XML-Datentyp ist eine weitere Option, es handelt sich jedoch um eine Entwurfsänderung und nicht um eine Abfrage der ersten Ebene.

Shriram Rajagopal
quelle
5
Bitte erläutern Sie, wie dies die Frage löst. Anstatt zu sagen, "Pls beziehen sich auf die Verwendung von", geben Sie ein Beispiel, wie dies die gestellte Frage erreichen würde. Es kann auch hilfreich sein, Quellen von Drittanbietern zu zitieren, wenn dies die Dinge klarer macht.
Bitsoflogic
1
Sieht aus wie STUFFist ähnlich zu spleißen. Nicht sicher, wie das auf meine Frage zutrifft.
mpen