我正在尝试使用第一个选择到第二个的值运行以下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
等
答案 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