我不知道为什么我收到以下错误:
关键字“UNION”附近的语法不正确。
我的表格如下:
+-------+--------+---------------+
| label | Name | Budget |
+-------+--------+---------------+
| 1 | ABC | Allocated |
| 1 | DEF | NotAllocated |
| 0 | XYZ | Allocated |
| 0 | LMN | Allocated |
| 1 | QRS | NotAllocated |
+-------+--------+---------------+
我有一个名为Label
的列,由1和0组成。
label
为1 = 10540 label
为0 = 1546 我有很多“1”的记录,所以我想将它们取样到“0”级
我正在尝试获取1600条label
为1的记录和1546条label
为0的记录。
我尝试了以下但是我收到了一个错误。如何解决这个问题?
SELECT TOP 1600 *
FROM myTable
ORDER BY label ASC
UNION ALL
SELECT TOP 1546 *
FROM myTable
ORDER BY label DESC
答案 0 :(得分:2)
您可以使用以下解决方案:
SELECT * FROM (SELECT TOP 1600 * FROM myTable ORDER BY label ASC) t1
UNION ALL
SELECT * FROM (SELECT TOP 1546 * FROM myTable ORDER BY label DESC) t2
您在ORDER BY
上收到UNION
的错误消息。您只能在ORDER BY
SELECT
语句之后放置UNION
。在您的情况下,这不起作用,因为您使用不同的ORDER BY
条件。因此,您可以通过“重新选择”查询结果来解决此问题。您可以在Transact-SQL documentation上找到有关此主题的更多信息。
@zorkolot已在his answer中提及,如果您只想ORDER BY
列ORDER BY
获取0或1的行,则不需要label
所以你也可以使用以下内容:
SELECT TOP 1600 * FROM myTable WHERE label = 0
UNION ALL
SELECT TOP 1546 * FROM myTable WHERE label = 1
演示(两种解决方案的 ): http://sqlfiddle.com/#!6/d9c21/4/1
另一个想法:
如果您想获得每组最多行数(最多1600行label = 1
和最多1600行label = 0
,那么总和最多3200行)。您应该使用以下内容:
SELECT TOP 1600 * FROM myTable WHERE label = 0
UNION ALL
SELECT TOP 1600 * FROM myTable WHERE label = 1
答案 1 :(得分:2)
我正在尝试获取1600条记录,其中标签为1和1546条记录 其中label为0。
你可以说WHERE label = #
而不是使用order by。
SELECT TOP 1600 *
FROM myTable
WHERE label = 1
UNION ALL
SELECT TOP 1546 * --you might not even need TOP here (there are only 1546)
FROM myTable
WHERE label = 0