2012-11-06 5 views
6

der ich eine Abfrage wie folgt Lassen Sie sagen haben:Where-Klausel auf Unterabfrage Anweisung in ausgewählten

Select col1, 
      col2, 
      (select count(smthng) from table2) as 'records' 
    from table1 

ich möchte es Filter für Spalte ‚records‘ nicht null zu sein.

Ich kann das nicht tun:

  Select col1, 
       col2, 
       (select count(smthng) from table2) as 'records' 
      from table1 
     where records is not null 

Das Beste, was ich mit aufkommen, diese resultset auf einen Tabellenwert-Parameter zu schreiben und eine separate Abfrage an diesem resultset hat. Irgendwelche Ideen?

+0

@RichardTheKiwi Ihre Abfrage ist perfekt, aber ich habe es bearbeitet, um kürzer zu machen. Wählen Sie X. * aus (Wählen Sie Spalte1, Spalte2, (wählen Sie ..... aus Tabelle2) als Datensätze aus Tabelle1) X wo Datensätze nicht Null ist; –

Antwort

9

einfach verschieben Sie sie in einer abgeleiteten Abfrage. Sie können keine Spalte verwenden, die in der SELECT-Klausel in der WHERE-Klausel definiert ist.

Select col1, col2, records 
from 
(
    Select col1, 
      col2, 
      (select ..... from table2) as records 
    from table1 
) X 
where records is not null; 
3

Sie sollten einige kleine Modifikationen tun es:

Zu allererst hinzufügen auf der Unterabfrage TOP-Klausel der Abfrage zu zwingen, nur eine Aufzeichnung dieser table2 zurückzukehren. Eine Unterabfrage wie diese muss nur einen Skalarwert enthalten.

Zweitens kann die Unterabfrage nur eine Spalte in ihrer Spaltenliste enthalten, daher sollte der Rückgabewert wiederum ein Skalarwert sein.

Endlich können Sie die Unterabfrage oder irgendeine gemachte Spalte in einer Auswahlklausel nicht filtern. Also meine Empfehlung ist entweder "join" s oder "exists" zu verwenden.

Select col1, 
     col2 
     from table1 
     left outer join 
      table2 
     on table1.key = table2.key 
     where not table2.key is null 

Oder diese:

Select col1, 
     col2 
     from table1 
     inner join 
      table2 
     on table1.key = table2.key 

Oder diese:

Select col1, 
     col2 
     from table1 
     where exists (
      select * 
        from table2 
        where table2.key = table1.key 
        and not table2.somethingelse is null 
        -- or any other relevant conditions 
     ) 

Prost

+0

Es sagt "ungültigen Spaltennamen Datensätze" auf Where-Klausel – user194076

+0

Ich entschuldige mich, Herr. Sehen Sie sich den aktualisierten Beitrag erneut an. Vielen Dank. – Rikki

Verwandte Themen