2016-08-29 7 views
0

Ich habe zwei Tabellen Ich mag würde mehrere Bedingungen kombinieren und auf die gewünschten Daten herausziehen: Tabelle 1:.. [Folder1] [Name] [Info]Joining Tabellen mit mehreren Bedingungen

|---------------------|------------------|------------------| 
|  NameID   |  Gender  |  DoB  | 
|---------------------|------------------|------------------| 
|   1   |   M  | 19800909  | 
|---------------------|------------------|------------------| 
|   2   |   M  | 19620102  | 
|---------------------|------------------|------------------| 
|   3   |   F  | 19501012  | 
|---------------------|------------------|------------------| 
|   4   |   F  | 19900212  | 
|---------------------|------------------|------------------| 
|   5   |   M  | 19501010  | 
|---------------------|------------------|------------------| 

und Tabelle 2:.. [Folder1] [Body] [Anmelden]

|----------------|------------|------------|------------| 
|  NameID | BODYID | Category |  Result | 
|----------------|------------|------------|------------| 
|   1  | 80000001 | Height | 178  | 
|----------------|------------|------------|------------| 
|   1  | 80000002 | Waist | 32  | 
|----------------|------------|------------|------------| 
|   1  | 80000003 | weight | 78  | 
|----------------|------------|------------|------------| 
|   1  | 80000003 | weight | 85  | 
|----------------|------------|------------|------------| 
|   2  | 80000001 | height | 170  | 
|----------------|------------|------------|------------| 
|   2  | 80000002 | waist | 30  | 
|----------------|------------|------------|------------| 
|   2  | 80000003 | weight | 78  | 
|----------------|------------|------------|------------| 
|   2  | 80000003 | weight | 80  | 
|----------------|------------|------------|------------| 
|   2  | 80000003 | weight | 76  | 
|----------------|------------|------------|------------| 
|   3  | 80000001 | height | 168  | 
|----------------|------------|------------|------------| 
|   4  | 80000001 | height | 170  | 
|----------------|------------|------------|------------| 
|   5  | 80000001 | height | 171  | 
|----------------|------------|------------|------------| 

ich die 2 Tische zusammen mit festgelegten Bedingungen kombinieren möchten, so dass die kombinierte graph Top 50 NameID, Geschlecht, Geb., BodyID haben würde, Kategorie, Ergebnis von Personen mit DoB vor 19900101, zeigt nur die Daten zu Höhe und Gewicht und zeigt nur die Peo ple mit 3 oder mehr Gewichtsdaten.

Der aktuelle SQL-Code ich jetzt habe, ist:

SELECT TOP 50 [Info].[NameID] 
,[Gender] 
,[DoB] 
,[BodyID] 
,[Category] 
,[Result] 
FROM [Folder1].[Name].[Info] LEFT JOIN [Folder1].[Body].[Sign] 
ON [Info].[NameID] = [Sign].[NameID] 
WHERE ([DoB] < '19900101') 
AND ([Category] = 'Weight' OR [Category] = 'Height') 
AND [Category] IN (SELECT Count(case when [BODYID] = 80000003 then 1 else null end) FROM [Folder1].[Body].[Sign] GROUP BY [Category] HAVING COUNT([BODYID]) >2) 
ORDER BY [NameID] 

Die Abfrage erfolgreich ausgeführt werden kann, und eine Tabelle zeigt, aber keine Angaben erschienen. Ich habe das Gefühl, dass etwas mit diesem "Zähl" -Abschnitt nicht stimmt, aber ich konnte nicht herausfinden, was damit nicht stimmt.

Was ich hoffe, als ein Ergebnis zu erhalten, ist so etwas wie:

|------------|------------|------------|------------|--------|--------| 
| NameID | Gender | DoB  |  BODYID |Category|Result | 
|------------|------------|------------|------------|--------|--------| 
|  2  | M   | 19620102 | 80000001 |Height | 170 | 
|------------|------------|------------|------------|--------|--------| 
|  2 | M   | 19620102 | 80000003 |Weight | 78 | 
|------------|------------|------------|------------|--------|--------| 
|  2 | M   | 19620102 | 80000003 |Weight | 80 | 
|------------|------------|------------|------------|--------|--------| 
|  2 | M   | 19620102 | 80000003 |Weight | 76 | 
|------------|------------|------------|------------|--------|--------| 

Vielen Dank im Voraus.

Antwort

0

Ich bin nicht sicher, dass ich die ganze Frage folgen, aber das ist definitiv nicht gut aussieht:

AND [Category] IN (SELECT Count(case when [BODYID] = 80000003 then 1 else null end) 
        FROM [Folder1].[Body].[Sign] 
        GROUP BY [Category] 
        HAVING COUNT([BODYID]) > 3 
       ) 

verstehe ich nicht vollständig die Logik, aber ich könnte mir vorstellen, dass Sie wollen:

AND [Category] IN (SELECT [Category] 
        FROM [Folder1].[Body].[Sign] 
        GROUP BY [Category] 
        HAVING COUNT([BODYID]) > 3 
       ) 

oder vielleicht:

AND [Category] IN (SELECT [Category] 
        FROM [Folder1].[Body].[Sign] 
        GROUP BY [Category] 
        HAVING SUM(case when [BODYID] = 80000003 then 1 else 0 end) > 3 
       ) 
+0

Die erste Abfrage funktioniert nicht, die Abfrage gibt auch Daten von Personen zurück, die weniger als 3 Gewichtseinträge haben. Die zweite Abfrage zeigt eine Tabelle, aber keine Daten/Informationen darin. – Kaiser

+0

Sorry für die Mehrdeutigkeit; Ich habe eine Tabelle hinzugefügt, wie ich gehofft habe, dass die Abfrage wie folgt zurückkehren könnte. Ich habe beide Abfragen ausprobiert, die Sie aufgelistet haben, aber keiner von ihnen hat das Ergebnis erreicht. – Kaiser

0

Es ist wie der Grund sieht könnten Sie nicht Ergebnisse bekommen wird becaus e Sie haben einen SELECT COUNT in Ihrer where-Klausel für. Der folgende Code zeigt den Problembereich.

AND [Category] IN (SELECT Count(case when [BODYID] = 80000003 then 1 else null end) 
FROM [Folder1].[Body].[Sign] GROUP BY [Category] HAVING COUNT([BODYID]) >3) 

Das Problem ist, dass Sie eine Kategorie vergleichen, die ein varchar mit einer Zählung zu sein scheint, die einen int-Wert zurück. Wenn also die Anzahl der Unterabfragen = 10 ist, stimmt sie mit keiner Ihrer Kategorien überein.

Dies ist wahrscheinlich, warum Sie keine Ergebnisse sehen, weil Sie keine Kategorien gleich der Anzahl Ihrer Unterabfrage haben.

1

Wenn Sie verlassen eine Tabelle beitreten und dann Bedingung für eine Spalte, die innerhalb dieser Tabelle vorhanden ist, machen Sie tatsächlich eine innere Verbindung durch Verwerfen aller Zeilen aus der Ausgabe, die diese Bedingung nicht erfüllen. Da dies ein linker Join ist, kann eine Joining-Bedingung zu false ausgewertet werden, und dennoch erzwingen Sie eine andere Bedingung in der WHERE-Klausel, so dass diese Zeile verworfen wird, da sie auch als false ausgewertet wird.

Ich werde nicht der Logik in Ihrem gesamten WHERE-Klausel folgen, aber ich habe eine Bedingung JOIN-Klausel und hinzugefügt Klammern mit OR [Category] IS NULL zum „kompliziert“ Zustand bewegt, so dass selbst wenn LEFT JOIN nicht erfüllt ist, und in diesem Fall würde [Category]NULL sein, es gibt immer noch Zeilen in der Ausgabe zurück.

SELECT TOP 50 [Info].[NameID] 
,[Gender] 
,[DoB] 
,[BodyID] 
,[Category] 
,[Result] 
FROM [Folder1].[Name].[Info] LEFT JOIN [Folder1].[Body].[Sign] 
ON [Info].[NameID] = [Sign].[NameID] AND [Sign].[Category] IN ('Weight', 'Height') 
WHERE [DoB] < '19900101' 
AND ([Category] IN (...) OR [Category] IS NULL) 
ORDER BY [NameID] 
+0

Ich kann die Logik mit dem LEFT JOIN Teil verfolgen; aber das Hauptproblem, das ich habe, ist, eine Bedingung mit der WHERE-Klausel zu setzen, wo ich die Zahl der Gewichteinträge zählen kann und die Informationen der Leute mit 3 oder mehr Gewichteinträgen zeigen kann. Aber die Abfragen scheinen einfach nicht zu funktionieren. – Kaiser