我正在编写一个存储过程来填充多选控件,我想从数据库表中取回至少100个选项,但我想确保将所有选项都带回用户已经选定。使用UNION出现意外的结果
现有的查询带回只有第100行:
SELECT TOP 100
t2.Id,
t2.value2
FROM
table1 t1
INNER JOIN
table2 t2
ON
t1.clientId = t2.clientId AND t1.Id = t2.Id
WHERE
t1.clientId = 1
我添加了一个UNION
到这个查询,以确保我总是选定的选项后面还有:
SELECT TOP 100
t2.Id,
t2.value2
FROM
table1 t1
INNER JOIN
table2 t2 ON
t1.clientId = t2.clientId AND t1.Id = t2.Id
WHERE
t1.clientId = 1
UNION
SELECT t2.id,
t_si.externalCertificateNumber
FROM table2 t2
INNER JOIN
Table3 t3
ON t2.value = 333
在我的一个测试例子中,有4个先前选择的选项。其中3个将返回前100名(1不是,因此需要更新)。
我预计会回到101行,并惊讶地得到104.我认为这是固有的DISTINCT
正在工作的方式。
但是我也看到的是返回的不同的结果。随着一些(超过3个)不同的值出现。还有一些在之前的TOP 100
中没有了!
所以我的问题是,UNION
有某种内置的排序,会影响结果?或者还有其他事情在这里发生?
-----------------------------编辑---------------- --------------
如果我改变上述查询前5:
和先前选择的值是:
1, Blue
2, Green
20, Violet
100 Indigo
的结果SELECT自己看起来像这样:
1, Blue
2, Green
7, Red
15, Cyan
20, Violet
为SELECT和UNION结果
1, Blue
2, Green
33, Cyan
20, Violet
24, Yellow
100, Indigo
60, Aero
40, Amber
25, Black
这是由例如从数据库中没有,但要注意,红色在SELECT从SELECT与UNION
? – jarlh
我的猜测是,您的查询中的第二个选择返回多个记录。你为什么期望从该查询中获得单个记录? –
@jarlh它返回4,这是我的预期。这是之前选择的4个选项。 – AidanO