2010-03-12 12 views
6

Tabelle ein enthältSQL Join Tables

ID|Name 
1 Mary 
2 John 

Tabelle zwei enthält

ID|Color 
1 Red 
2 Blue 
2 Green 
2 Black 

ich wollen am Ende ist

ID|Name|Red|Blue|Green|Black 
1 Mary Y Y 
2 John  Y  Y  Y 

Vielen Dank für jede Hilfe.


Vielen Dank für die Antworten. Ich werde dies mit einigen zusätzlichen Informationen über genau das, was ich versuche zu tun, das dies komplizieren könnte. Kann jemand das schließen?

+0

Welche Datenbank? –

+0

-1: Sie müssen uns mitteilen, welches DBMS Sie verwenden. –

+0

Ich verwende ADO, um eine Verbindung zu einer Visual Foxpro DB herzustellen. – Harley

Antwort

6

Wenn Sie T-SQL verwenden Sie PIVOT verwenden können (http://msdn.microsoft.com/en-us/library/ms177410.aspx)

Hier Abfrage ich verwendet:

declare @tbl_names table(id int, name varchar(100)) 
declare @tbl_colors table(id int, color varchar(100)) 

insert into @tbl_names 
select 1, 'Mary' 
union 
select 2, 'John' 


insert into @tbl_colors 
select 1, 'Red' 
union 
select 1, 'Blue' 
union 
select 2, 'Green' 
union 
select 2, 'Blue' 
union 
select 2, 'Black' 

select name, 
     case when [Red] is not null then 'Y' else '' end as Red, 
     case when [Blue] is not null then 'Y' else '' end as Blue, 
     case when [Green] is not null then 'Y' else '' end as Green, 
     case when [Black] is not null then 'Y' else '' end as Black 

from 
(
select n.id, name, color from @tbl_names n 
inner join @tbl_colors c on n.id = c.id 
) as subq 
pivot 
(
    min(id) 
    FOR color IN ([Red], [Blue], [Green], [Black]) 
) as pvt 

Und hier ausgegeben:

John  Y Y Y 
Mary Y Y  
+0

Drei Probleme mit dieser Lösung: 1) die Daten, die Sie in die Tabellen einfügen, sind nicht die in der Frage angegebenen Daten, 2) es erfordert, dass Sie die Liste der Farben zur Entwurfszeit streng begrenzen, was unwahrscheinlich ist und 3) es ist SQL Server-Lösung, keine VFP-Lösung (obwohl ich glaube, dass das OP nur die Foxpro-Tags hinzugefügt hat, nachdem Sie die Lösung veröffentlicht haben). –

+0

Ich habe Daten von der Frage genommen, es sieht so aus, als ob Harley es bearbeitet hat. Gleiches gilt für Foxpro ... –

1

Ich glaube, Sie‘ Gehen Sie mit so etwas wie folgt:

SELECT t1.ID, 
     t1.Name, 
     CASE 
      WHEN red.ID IS NULL THEN '' 
      ELSE 'Y' 
     END As Red, 
     CASE 
      WHEN blue.ID IS NULL THEN '' 
      ELSE 'Y' 
     END As Blue 
FROM Table1 t1 
    LEFT JOIN Table2 Red 
     ON t1.ID = Red.ID AND Red.Color = 'Red' 
    LEFT JOIN Table2 Blue 
     ON t1.ID = Blue.ID AND Blue.Color = 'Blue' 

MS Sql unterstützt keine PIVOT-Abfragen wie MS Access.

+0

Die Join-Bedingungen müssen nur auf "und Red.Color" und "and Blue.Color" korrigiert werden. – DyingCactus

+0

SQl Server 2005 und höher haben tatsächlich PIVOT und UNPIVOT. – DancesWithBamboo

+0

Korrigieren Sie es, aber am Ende geben Sie immer noch jede Spalte/Variable an, die Sie drehen möchten. MS Access bietet eine Möglichkeit zum dynamischen Erstellen einer Pivot-Abfrage basierend auf Werten. Darauf bezog ich mich, indem ich sagte "wie MS Access" – Ender

-1

Im Gegensatz zu dem, was einige andere Poster gesagt haben; Ich sehe keinen Bedarf für einen dritten Tisch. Wenn Farben eine bekannte Aufzählung in Ihrer Anwendung sind, benötigen Sie keine "Farb" -Tabelle.

Was Sie suchen, ist ein PIVOT wie dieses one.

2

Ich kann eine CASE-Anweisung mit einer Unterabfrage verwenden, um die Y-Werte einzugeben.

select ID, Name, 
    case 
    when exists (select * from Colors C where C.ID = N.ID and Color = 'Red') then 
     'Y' 
    else 
     NULL 
    end 
, 
case 
    when exists (select * from Colors C where C.ID = N.ID and Color = 'Blue') then 
     'Y' 
    else 
     NULL 
    end 
, 
case 
    when exists (select * from Colors C where C.ID = N.ID and Color = 'Green') then 
     'Y' 
    else 
     NULL 
    end 
, 
case 
    when exists (select * from Colors C where C.ID = N.ID and Color = 'Black') then 
     'Y' 
    else 
     NULL 
    end 
from Names N 
+0

Ich denke, dass diese Lösung sehr langsam sein wird ... so viele Unterabfragen. – Ender

+0

@Ender Die Verwendung von eindeutigen Integritätsbedingungen für die Tabelle "Farben" kann zur Verbesserung des Ausführungsplans beitragen, da sie vorhersagen kann, dass es sich bei der Unterabfrage um eine skalare Abfrage handelt. Entweder dies, der Pivot, oder der andere Fall, den Larry benutzt, würde 4 Joins (oder einen Join für jede mögliche Farbe) erfordern. Wenn Sie Daten wie diese rotieren, enden Sie oft mit ziemlich langsamen Abfragen. Dies könnte mit einem besseren Tischdesign vermieden werden, aber es klingt so, als wäre das Poster auf das beschränkt, was das Drittparteisystem bereits implementiert hat. Ich fühle seinen Schmerz, weil dies eine schwierige Situation ist. – AaronLS

1

Wie andere Kommentatoren darauf hingewiesen haben, zeigen Sie nicht genau an, wie Sie Menschen und Farben verknüpfen. Wenn Sie eine Verknüpfungstabelle (person_id, color_id) verwenden, gibt es keine Möglichkeit, dieses Problem in Standard-SQL zu lösen, da eine Pivot- oder Kreuztabelle erforderlich ist, die nicht zu Standard-SQL gehört.

Wenn Sie die Bedingung hinzufügen möchten, dass die Anzahl der Farben begrenzt und bekannt ist und die Entwurfszeit, können Sie eine Lösung mit einem Join für jede Farbe und CASE- oder IF-Funktionen in SQL erstellen. Aber das wäre nicht elegant, und außerdem würde ich diesem Zustand nicht vertrauen, um lange zu bleiben.

Wenn Sie in der Lage sind, eine andere Möglichkeit zum Speichern der Farbverknüpfungsinformationen zu finden, haben Sie möglicherweise mehr Möglichkeiten, die gewünschte Ausgabe zu erzeugen. Eine andere Speichertechnik bedeutet jedoch eine gewisse Denormalisierung der Datenbank andere Schwierigkeiten.

Andernfalls müssen Sie dies in einer gespeicherten Prozedur oder Anwendungscode tun.

+0

Es gibt keine Verknüpfungstabelle, nur die gemeinsame ID. In Tabelle 2 haben wir derzeit 11 mögliche Werte für "Farbe", so dass jede eindeutige ID aus Tabelle 1 bis zu 11 Datensätze in Tabelle 2 haben kann. – Harley

+0

Außerdem hat Tabelle eins 285.000 Datensätze und Tabelle zwei hat 773.000. Daher ist das Erstellen einer Verknüpfungstabelle vor dem Ausführen einer Abfrage möglicherweise nicht praktikabel. Da die Tabellen durch Software von Drittanbietern verwaltet werden, die sie dazu bringt, die Verknüpfungstabelle zu ihrem Code hinzuzufügen, würde dies wahrscheinlich niemals geschehen. – Harley

+0

Es macht jetzt mehr Sinn, dass Sie die ID-Werte in Tabelle 2 von 1, 2, 3, 4 bis 1, 2, 2, 2 aktualisiert haben. Die Ausgabe stimmt jedoch immer noch nicht mit Ihren Tabellendaten überein. Blauer Rekord in Tabelle 2. –