加入从另一个获取值的查询

时间:2015-04-01 20:57:52

标签: sql ms-access

我正在尝试使用第一个选择到第二个的值运行以下MS Access查询: (这个问题起源于Using results from a query within the same query,但我对其进行了大幅改动,我认为这是一个新问题。

SELECT 
A.field1,
A.field2,
A.field3,
FROM TheTable AS A
Where A.Id = 3;
?Join / UNION?
SELECT
B.field4,
B.field5
FROM TheTable AS B
Where B.Id = field1

最后,基于这两个查询,我希望有5列作为输出,但是如何正确地为此加入/联合呢?请注意,TheTable在两个查询中都是相同的,但我在每个部分使用它的方式不同......

我不会在下一行2列(和null)中使用第一行3个元素。只要我能在一个查询中完成它。

所以输出看起来像是:

A.field1, A.field2, A.field3, B.field4, B.field5
1, 2, 3, 4, 5

2 个答案:

答案 0 :(得分:1)

只有在每个查询生成相同数量的行或者总是生成更少行时,才能使用连接。

除此之外,您可以从一个查询或两个查询的并集中获取此输出。

联盟实际上更简单,更容易维护:

SELECT  A.field1, A.field2, A.field3, null Field4, null Field5
FROM    TheTable AS A
Where   A.Id = 3
union all
SELECT  null, null, null, B.field4, B.field5
FROM    TheTable AS B
Where   B.Id = field1;

单个查询更有效,但它也稍微复杂一些:

SELECT  case id when 3 then field1 else null end as Field1,
        case id when 3 then field2 else null end as Field2,
        case id when 3 then field3 else null end as Field3, 
        case id when 3 then null else field4 end as Field4, 
        case id when 3 then null else field5 end as Field5
FROM    TheTable AS A
Where   Id = 3
    or  Id = Field1;

但是,您必须回答的主要问题可能不是效率高于可维护性。你需要考虑的一件事是,如果Field1可以等于3.如果情况应该是这样,那么同一行将在" A"中生成一个元组。查询和" B"在联盟中查询。但是,如上所述,它只会生成一个带有Field1,Field2和Field3值的元组,并在单个查询中生成Field4和Field5字段中的NULL。

因此,如果有可能(Field1 = ID),您必须选择哪个查询为您的需求生成最佳结果。如果无法满足该条件,则选择其中一个。

答案 1 :(得分:0)

我认为你想要的是

SELECT 
A.field1,
A.field2,
A.field3,
B.field4,
B.field5
FROM TheTable  A inner join  TheTable AS B on
B.Id = field1
Where A.Id = 3