Frage

Ich würde wirklich gern wissen, ob es möglich ist, eine select-Anweisung zu tun, das gibt genau gleiche Aufzeichnungen, dass wir in setzten in Klausel?

Beispiel:

select * from table
where table_id in (1, 2, 3, 666);

Diese Tabelle für ein Beispiel hat nur id-s von 1 bis 100, so dass diese Auswahl nur drei Zeilen angezeigt werden kann. Was ich tun müssen, um bekommen, auch eine (wahrscheinlich null oder Dummy) Zeile für 666?

Danke!

War es hilfreich?

Lösung

Sie könnten Vereinigung verwenden:

select * from table
where table_id in (1, 2, 3);
union
select 666 as table_id, other_fields_with_dummy_values_in_table from dual;

ist, wie Sie es in Oracle tun könnten. Die from dual könnte variieren, je nachdem, was Datenbanksystem Sie verwenden.

Seien Sie sich bewusst sein, dass, wenn Sie Vereinigung verwenden, Ihre Dummy-Abfrage die gleichen Datensätze als die eigentliche Abfrage auswählen.

Andere Tipps

Sie können ohne eine Tabelle

wählen

Sie einfach eine UNION mit Ihrer Anfrage

select table_id, some_column from table
where table_id in (1, 2, 3, 666);
union
select 666, 'dummy_data'

Unter der Annahme einer Tabelle numbers enthält alle Zahlen von, sagen wir, 1-1000000 (in der Tat genug, dass Ihr Bereich der Eingangswerte abgedeckt ist), können Sie das folgende SQL ausführen:

SELECT *
  FROM numbers left outer join table on table.table_id = numbers.number
 WHERE numbers.number in (1, 2, 3, 666)

Wenn Sie einen DBMS, dass bietet eine bessere Lösung, wie z. G. SQL Anywhere mit seinem sa_rowgenerator Prozedur, können Sie die Tabelle numbers mit einem Prozeduraufruf ersetzen, und nicht eine Begrenzung einer maximalen Anzahl haben.

IN Klausel ist ein boolean Prädikat, so dass Sie es mit einem Dummy-Cord ersetzen müssen:

SELECT  m.*
FROM    (
        SELECT  1 AS id
        UNION ALL
        SELECT  2 AS id
        UNION ALL
        SELECT  3 AS id
        UNION ALL
        SELECT  666 AS id
        ) q
LEFT JOIN
        mytable m
ON      m.id = q.id

In SQL Server 2008, können Sie diese Abfrage ausführen:

SELECT  *
FROM    @mydata d
LEFT JOIN
        mytable t
ON      t.id = d.id

mit @mydate ist eine Tabelle Variable als Parameter vom Client übergeben.

In PostgreSQL, können Sie diese Abfrage ausführen:

SELECT  *
FROM    (
        SELECT  :arr[s] AS id
        FROM    generate_series(1, array_upper(:arr, 1)) s
        ) q
LEFT JOIN
        mytable t
ON      t.id = q.id

wobei :arr ist ein Array [1, 2, 3, 666], auch vom Client als Parameter übergeben.

In Oracle können Sie tun:

SELECT  *
FROM    TABLE(:mycol) q
LEFT JOIN
        mytable t
ON      t.id = q.id

, wobei :mycol ist eine Variable von Kollektionstyp, vom Client übergeben.

Eine Möglichkeit, daran zu denken ist: Sie müssen, dass die Daten haben „Enter“ die Abfrage als Datensatz. Daten gefunden in where-Klauseln nie „hinzugefügt“, um die Abfrage, werden sie nur verwendet, um Filter vorhandenen Daten aus.

Ein kurzes Beispiel:

DECLARE @MustInclude (Value  int  not null)

INSERT @MustInclude (Value) values (1)
INSERT @MustInclude (Value) values (2)
INSERT @MustInclude (Value) values (3)
INSERT @MustInclude (Value) values (666)

SELECT *
 from @MustInclude mi
  left outer join MyTable mt
   on mt.Value = mi.Value
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top