我真的很想知道是否可以做一个选择的声明,该语句返回完全相同的记录,我们投入了 条款?

样本:

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

该表的示例仅具有1到100的ID-S,因此此选择仅返回三行。我需要做什么,还需要获得666的一行(可能是无效或虚拟)行?

谢谢!

有帮助吗?

解决方案

您可以使用联盟:

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;

是您可以在Oracle中做到的。这 from dual 可能会根据您使用的数据库系统而有所不同。

请注意,如果您使用Union,则您的虚拟查询必须选择与真实查询相同的记录。

其他提示

您可以在没有表的情况下选择

只需与您的查询结合

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

假设一张桌子 numbers 包含所有数字,例如1到1000000(实际上足够涵盖了输入值范围),您可以运行以下SQL:

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

如果您使用提供更好解决方案的DBM,例如任何地方的SQL sa_rowgenerator 过程,您可以替换表 numbers 使用程序调用,并且没有最大数字的限制。

IN 条款是布尔谓词,因此您需要用虚拟记录集替换它:

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

SQL Server 2008, ,您可以运行此查询:

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

@mydate 是一个表变量,从客户端传递为参数。

PostgreSQL, ,您可以运行此查询:

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

在哪里 :arr 是一个数组 [1, 2, 3, 666], ,也从客户端作为参数传递。

Oracle, , 你可以做:

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

, , 在哪里 :mycol 是从客户端传递的收集类型的变量。

思考它的一种方法是:您需要将数据“输入”查询作为数据集。在从条款中从未“添加”查询中的条款中找到的数据,它们仅用于过滤现有数据。

一个快速示例:

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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top