2014-07-09 93 views
0

僅用於實驗目的。SQL,使用查詢本身提供的數據構建查詢

我想構建一個查詢,但不查詢爲任何表提取的數據,而是查詢自查詢中提供的數據。像:

select numbers.* from (1, 2, 3) as numbers; 

select numbers.* from (field1 = 1, field2 = 2, field3 = 3) as numbers; 

,所以我可以做的事情一樣

select 
    numbers.* 
from (field1 = 1, field2 = 2, field3 = 3) as numbers 
where numbers.field1 > 1; 

如果解決方案是特定的數據庫引擎可以很有趣了。

+1

你可以做'選擇號碼* FROM(SELECT 1 AS A,2爲B,3爲C UNION SELECT 4,5,6)AS號碼 – scragar

+0

@scragar您可以請您的解決方案創建一個答案?有用! – fguillen

回答

2

如果你想要的值,以便在單獨的行,而不是在同一行的三個字段,方法是每一個union all鏈接的值相同,只是一行。

select * 
from(
    select 1 as FieldName union all 
    select 2 union all 
    select 3 union all 
    select 4 union all -- we could continue this for a long time 
    select 5 -- the end 
) as x; 

select numbers.* 
from(
    select 1 ,2, 3 
    union select 3, 4, 5 
    union select 6, 7, 8 
    union select 9, 10, 11 -- we could continue this for a long time 
    union select 12, 13, 14 -- the end 
) as numbers; 

這工作與MySQL Postgres的(以及大多數其他人也)。

[編輯]使用union all而不僅僅是union,因爲您不需要從常量列表中刪除重複項。給第一個select中的字段一個有意義的名字。否則,您無法在以後指定特定字段:where x.FieldName = 3

如果您沒有爲字段提供有意義的名稱(如第二個示例中所示),那麼系統(至少在此處測試過的MySQL)將爲第一個字段分配名稱「1」,將「2」分配爲第二個等等。所以,如果你想指定的領域之一,你必須寫這樣的表達式:

where numbers.1 = 3 
+0

接受,因爲它是最明確的答案,而不是引擎特定的。 – fguillen

+1

不,全是必要的。由於這是一個常量列表,所以任何重複都不會存在,除非它們是有意的。如果沒有重複,那麼對系統進行無效排序和重複數據刪除是浪費週期,如果它們是故意的,那麼您當然不希望刪除重複數據。 – TommCatt

1

使用values排構造:

select * 
from (values (1),(2),(3)) as numbers(nr); 

或使用CTE。

with numbers (nr) as (
    values (1),(2),(3) 
) 
select * 
from numbers 
where nr > 2; 

編輯:我只注意到你也taggeg你的問題與mysql:上面會不會使用MySQL,只有Postgres的(和一些其他DBMS)

1

您可以使用子查詢沒有表像這樣:

SELECT 
    numbers.* 
FROM (
    SELECT 
     1 AS a, 
     2 AS b, 
     3 AS c 
    UNION 
    SELECT 
     4, 
     5, 
     6 
) AS numbers 
WHERE 
    numbers.a > 1 

如果你喜歡的查詢總是有一個表引用有是始終有1行,沒有列名爲DUAL一個僞表,你可以用它像這樣:

SELECT 
    numbers.* 
FROM (
    SELECT 
     1 AS a, 
     2 AS b, 
     3 AS c 
    FROM 
     DUAL 
    UNION 
    SELECT 
     4, 
     5, 
     6 
    FROM 
     DUAL 
) AS numbers 
WHERE 
    numbers.a > 1 
+0

@a_horse_with_no_name確定刪除... –