2016-08-24 40 views
1

我有一个表的“产品”有N个记录(超过5000个,并随时更改号码)拆表的记录。我如何根据表生成两个查询,一个用于上半部分记录,另一个用于另一半?访问 - 我怎样才能在两个查询

+0

您是否有标识记录ID(流水号从1到n,为n的记录数)表中的任意列? – FDavidov

+0

如何区分上半年和下半年,记住记录顺序在数据库中没有意义? –

+0

嗨!我有一个IDNumber,但我需要在查询中使用另一个标准。我认为在Count记录中将记录数除以2(生成一个N整数),在查询中选择第一个查询中记录的N个顶部,并创建第二个不匹配的查询。 表格的结构是: 1.Id-Autonumber 2.ProductName-Text 3.价格 – KEOC

回答

1

使用(有没有遗漏的数字顺序编号,或至少一个字段),这可能工作的自动编号主键 - 虽然我还没有真正想通了,可能是几个陷阱?

返回ID号的前半部分:

SELECT ID 
FROM Table1 
WHERE ID<=INT((SELECT MAX(ID) FROM Table1)/2) 

返回ID号码下半年:

SELECT ID 
FROM Table1 
WHERE ID>INT((SELECT MAX(ID) FROM Table1)/2) 
+0

它确实可以工作,但很少有自动编号ID不会丢失。这是纯SQL中唯一可行的方法,但不可靠 –

+0

同意,绝对不可靠。 –

+0

@Darren Bartup库克 非常感谢达伦但我不能使用id-自动编号,这是因为在查询中我用另一种标准的“类别”。 表结构如下: ID -Auto 类别编号 产品-Txt Price-Curr。 当输入数据被随机插入 标识产品\t类别\t价格 1. 1. \t \t苹果\t \t $ 1.00包装 2. 2. \t \t兔\t \t $ 4.00 3. 3. \t \t奶酪\t \t $ 8.00 4. 2. \t \t \t鸡3.10 $ 5. 1. \t \t \t樱桃\t $ 2.50 如果我选择类别 “1” 的结果: 标识产品\t类别\t价格 1. 1. \t \t苹果\t \t $ 1.00包装 5. 1. \t \t樱桃\t \t $ 2.00 我有两个REC但最大Id是5 .. – KEOC

0

的问题是,你不能指定一个COUNT(*)的结果子查询在TOP指令,所以不可能在纯SQL

可靠地做到这一点100% 10

可靠的方法是用VBA预先建立你2个查询:

Sub Half_Table() 

    Dim lngTotal As Long 
    Dim lngHalf1 As Long 
    Dim lngHalf2 As Long 

    Dim strTable As String 
    Dim strIDfield As String 
    Dim strSQL1 As String 
    Dim strSQL2 As String 


    strTable = "table_Name" 
    strIDfield = "ID" 

    lngTotal = DCount("*", strTable) 
    lngHalf1 = Round(lngTotal/2) 
    lngHalf2 = lngTotal - lngHalf1 

    strSQL1 = "SELECT TOP " & lngHalf1 & " * FROM " & strTable & " ORDER BY " & strIDfield & " ASC" 
    strSQL2 = "SELECT TOP " & lngHalf2 & " * FROM " & strTable & " ORDER BY " & strIDfield & " DESC" 

    Debug.Print strSQL1 
    Debug.Print strSQL2 


End Sub 

变化strTablestrIDfield名称相应。

这会生成以下2个查询含1399条记录的表:

SELECT TOP 700 * FROM table_Name ORDER BY ID ASC 
SELECT TOP 699 * FROM table_Name ORDER BY ID DESC 

我还没展示了如何使用生成的SQL查询 后来我想你知道,

+0

非常感谢托马斯G – KEOC

0

考虑纯

上半

:使用的行数数合计子查询的SQL解决方案
SELECT [ID], [Category], [Product], [Price] 
FROM Products 
INNER JOIN 
    (SELECT [ID], 
      (SELECT Count(*) FROM Products t2 
      WHERE Products.[ID] <= t2.[ID]) AS ProductOrder, 
      (SELECT Count(*) FROM Products t2) AS ProductCount 
    FROM Products) AS sub 
ON Products.[ID] = sub.[ID] 
WHERE sub.ProductOrder >= sub.ProductCount/2 

下半部

SELECT [ID], [Category], [Product], [Price] 
FROM Products 
INNER JOIN 
    (SELECT [ID], 
      (SELECT Count(*) FROM Products t2 
      WHERE Products.[ID] <= t2.[ID]) AS ProductOrder, 
      (SELECT Count(*) FROM Products t2) AS ProductCount 
    FROM Products) AS sub 
ON Products.[ID] = sub.[ID] 
WHERE sub.ProductOrder <= sub.ProductCount/2