如何在单个表上执行UNION

时间:2017-11-21 07:57:50

标签: sql-server

我不知道为什么我收到以下错误:

  

关键字“UNION”附近的语法不正确。

我的表格如下:

+-------+--------+---------------+
| label |  Name  |    Budget     |
+-------+--------+---------------+
|     1 |    ABC |  Allocated    |
|     1 |    DEF |  NotAllocated |
|     0 |    XYZ |  Allocated    |
|     0 |    LMN |  Allocated    |
|     1 |    QRS |  NotAllocated |
+-------+--------+---------------+

我有一个名为Label的列,由1和0组成。

  1. label为1 = 10540
  2. 的记录数
  3. label为0 = 1546
  4. 的记录数

    我有很多“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
    

2 个答案:

答案 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 BYORDER 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