2017-01-27 10 views
2

Ich habe eine Abfrage, die ich nicht herausfinden kann.Unterabfrage auswählen, wenn Gruppe von null ist

SELECT (
    SELECT COUNT(bar.id) 
    FROM bar 
    WHERE foo.some_id = bar.some_id 
) AS num_bar 
    FROM foo 
    GROUP BY some_id 

wenn foo sieht wie folgt aus:

ID|some_id 
---------- 
1 |NULL 
2 |apple 
3 |orange 

und Bar sieht aus wie dieses

ID|some_id 
---------- 
1 |NULL 
2 |apple 
3 |orange 
4 |NULL 
5 |apple 
6 |orange 

ich es erwarten, zurückzukehren:

num_bar 
------- 
2 
2 
2 

howerver, der Graf auf Die NULL-Gruppierung gibt jedes Mal 0 zurück.

Was ist der richtige Weg, um diese WHERE-Klausel zu berücksichtigen, wenn die Gruppe durch NULL ist?

Antwort

1

SQL-Aggregatfunktionen und Vergleiche können NULL-Werte in ihre Berechnung ignorieren

Was Sie vielleicht tun möchten, ist es Wert zu geben und dann nulls entsprechend zu interpretieren. In der folgenden Abfrage fordern Sie die Abfrage auf, Nullwerte als -1 zu interpretieren.

SELECT (
SELECT COUNT(bar.id) 
FROM bar 
WHERE isnull(foo.some_id, -1) = isnull(bar.some_id,-1) 
) AS num_bar 
FROM foo 
GROUP BY isnull(some_id,-1) 
0

Wenn ich das richtig verstanden, Sie zusammen mit NULL's die some_id in bar Tabelle zählen möchten.

Verwenden Sie nicht some_id in count Aggregat wie count(some_id). Es ignoriert die Werte NULL und gibt immer Null zurück, wenn some_id NULL ist.

auf diese Weise versuchen

SELECT F.some_id, 
     Count(1) AS count_someid 
FROM foo F 
     INNER JOIN bar B 
       ON F.some_id = B.some_id 
        OR (F.some_id IS NULL AND B.some_id IS NULL) -- To join NULL records 
GROUP BY F.some_id 

NULL's in some_id wird auch mit der gleichen Logik wie Nagendra Kakarla

SELECT F.some_id ,COUNT(1) AS count_someid 
FROM FOO F 
INNER JOIN BAR B ON ISNULL(F.some_id,'#') = ISNULL(B.some_id,'#') 
GROUP BY F.some_id 

und Sie werden

0

einfach einen besseren Weg getrennt und gezählt gruppiert werden Erhalten Sie das Ergebnis wie

+---------+--------------+ 
| some_id | count_someid | 
+---------+--------------+ 
| NULL |   2 | 
| apple |   2 | 
| orange |   2 | 
+---------+--------------+ 
Verwandte Themen