如何在SQL中选择与另一个表中的另一个值对应的每个值

如何在SQL中选择与另一个表中的另一个值对应的每个值,sql,join,select,group-by,partitioning,Sql,Join,Select,Group By,Partitioning,这个标题听起来可能有点让人困惑,但本质上我想做的是从下表中提取出来。我用来创建下表的查询是 select d.FOLDER_ID, d.PKG_ID, p.file_id, d.PKG_START_TIME, d.PKG_END_TIME, d.ISVALID, d.VALIDFILE_COUNT, d.INVALIDFILE_COUNT, d.ISLOADED, d.LOADEDFILE_COUNT, d.REJECTEDFILE_COUNT from DATA_EXCHANGE_

这个标题听起来可能有点让人困惑,但本质上我想做的是从下表中提取出来。我用来创建下表的查询是

    select d.FOLDER_ID, d.PKG_ID, p.file_id, d.PKG_START_TIME, d.PKG_END_TIME, d.ISVALID, d.VALIDFILE_COUNT, d.INVALIDFILE_COUNT, d.ISLOADED, d.LOADEDFILE_COUNT, d.REJECTEDFILE_COUNT 

from DATA_EXCHANGE_PACKAGE d  full outer join PACKAGE_FILE p on d.PKG_ID = p.PKG_ID

where d.pkg_id = p.pkg_id

order by PKG_START_TIME asc
此表包含来自两个不同表的数据,如查询中所示,它根据包开始时间选择第一个记录

我试图实现的是,我想要一个查询,可以选择返回的pkg_id的数量,但我想要为选择的pkg_id数量选择的每个文件。例如,在我的数据库中,我可能有100个包,但我只想为前10个包选择每个文件Id。我该怎么做呢。我只能使用top选择前5条记录,并仅选择5个不同的pkg_id行,但不能为那些不同的5个pkg_id选择每个文件id。任何帮助都将不胜感激。我知道分组和分区可以实现我想要的,但我一直没有成功。我不是最擅长SQL的,所以这就是为什么我在挣扎,我认为这个查询会更容易创建。我也肯定where语句是没有意义的,但我还是保留了它

另外,我们假设文件夹\u Id始终为1

+-----------+--------+---------+-------------------------+-------------------------+---------+-----------------+-------------------+----------+------------------+--------------------+
| FOLDER_ID | PKG_ID | file_id |     PKG_START_TIME      |      PKG_END_TIME       | ISVALID | VALIDFILE_COUNT | INVALIDFILE_COUNT | ISLOADED | LOADEDFILE_COUNT | REJECTEDFILE_COUNT |
+-----------+--------+---------+-------------------------+-------------------------+---------+-----------------+-------------------+----------+------------------+--------------------+
|         1 |      1 |       1 | 2019-11-19 14:59:24.343 | NULL                    | NULL    | NULL            | NULL              | NULL     | NULL             | NULL               |
|         1 |      2 |       2 | 2019-11-19 15:10:20.157 | NULL                    | 1       | 10              | 0                 | NULL     | NULL             | NULL               |
|         1 |      2 |       3 | 2019-11-19 15:10:20.157 | NULL                    | 1       | 10              | 0                 | NULL     | NULL             | NULL               |
|         1 |      2 |       4 | 2019-11-19 15:10:20.157 | NULL                    | 1       | 10              | 0                 | NULL     | NULL             | NULL               |
|         1 |      2 |       5 | 2019-11-19 15:10:20.157 | NULL                    | 1       | 10              | 0                 | NULL     | NULL             | NULL               |
|         1 |      2 |       6 | 2019-11-19 15:10:20.157 | NULL                    | 1       | 10              | 0                 | NULL     | NULL             | NULL               |
|         1 |      2 |       7 | 2019-11-19 15:10:20.157 | NULL                    | 1       | 10              | 0                 | NULL     | NULL             | NULL               |
|         1 |      2 |       8 | 2019-11-19 15:10:20.157 | NULL                    | 1       | 10              | 0                 | NULL     | NULL             | NULL               |
|         1 |      2 |       9 | 2019-11-19 15:10:20.157 | NULL                    | 1       | 10              | 0                 | NULL     | NULL             | NULL               |
|         1 |      2 |      10 | 2019-11-19 15:10:20.157 | NULL                    | 1       | 10              | 0                 | NULL     | NULL             | NULL               |
|         1 |      2 |      11 | 2019-11-19 15:10:20.157 | NULL                    | 1       | 10              | 0                 | NULL     | NULL             | NULL               |
|         1 |      3 |      12 | 2019-11-19 15:58:26.733 | NULL                    | 1       | 10              | 0                 | NULL     | NULL             | NULL               |
|         1 |      3 |      13 | 2019-11-19 15:58:26.733 | NULL                    | 1       | 10              | 0                 | NULL     | NULL             | NULL               |
|         1 |      3 |      14 | 2019-11-19 15:58:26.733 | NULL                    | 1       | 10              | 0                 | NULL     | NULL             | NULL               |
|         1 |      3 |      15 | 2019-11-19 15:58:26.733 | NULL                    | 1       | 10              | 0                 | NULL     | NULL             | NULL               |
|         1 |      3 |      16 | 2019-11-19 15:58:26.733 | NULL                    | 1       | 10              | 0                 | NULL     | NULL             | NULL               |
|         1 |      3 |      17 | 2019-11-19 15:58:26.733 | NULL                    | 1       | 10              | 0                 | NULL     | NULL             | NULL               |
|         1 |      3 |      18 | 2019-11-19 15:58:26.733 | NULL                    | 1       | 10              | 0                 | NULL     | NULL             | NULL               |
|         1 |      3 |      19 | 2019-11-19 15:58:26.733 | NULL                    | 1       | 10              | 0                 | NULL     | NULL             | NULL               |
|         1 |      3 |      20 | 2019-11-19 15:58:26.733 | NULL                    | 1       | 10              | 0                 | NULL     | NULL             | NULL               |
|         1 |      3 |      21 | 2019-11-19 15:58:26.733 | NULL                    | 1       | 10              | 0                 | NULL     | NULL             | NULL               |
我想用上述数据实现的一个例子是,我只想根据pkg_开始时间以升序选择前两个不同的pkg_id。但是,当只选择这两个不同的pkg_id时,我希望输出这些pkg_id的每个文件的id。下表是我希望查询从上表中选择的内容

+-----------+--------+---------+-------------------------+--------------+---------+-----------------+-------------------+----------+------------------+--------------------+--------+
| FOLDER_ID | PKG_ID | file_id |     PKG_START_TIME      | PKG_END_TIME | ISVALID | VALIDFILE_COUNT | INVALIDFILE_COUNT | ISLOADED | LOADEDFILE_COUNT | REJECTEDFILE_COUNT | seqnum |
+-----------+--------+---------+-------------------------+--------------+---------+-----------------+-------------------+----------+------------------+--------------------+--------+
|         1 |      1 |       1 | 2019-11-19 14:59:24.343 | NULL         | NULL    | NULL            | NULL              | NULL     | NULL             | NULL               |      1 |
|         1 |      2 |       2 | 2019-11-19 15:10:20.157 | NULL         | 1       | 10              | 0                 | NULL     | NULL             | NULL               |      1 |
|         1 |      2 |       3 | 2019-11-19 15:10:20.157 | NULL         | 1       | 10              | 0                 | NULL     | NULL             | NULL               |      2 |
|         1 |      2 |       4 | 2019-11-19 15:10:20.157 | NULL         | 1       | 10              | 0                 | NULL     | NULL             | NULL               |      3 |
|         1 |      2 |       5 | 2019-11-19 15:10:20.157 | NULL         | 1       | 10              | 0                 | NULL     | NULL             | NULL               |      4 |
|         1 |      2 |       6 | 2019-11-19 15:10:20.157 | NULL         | 1       | 10              | 0                 | NULL     | NULL             | NULL               |      5 |
|         1 |      2 |       7 | 2019-11-19 15:10:20.157 | NULL         | 1       | 10              | 0                 | NULL     | NULL             | NULL               |      6 |
|         1 |      2 |       8 | 2019-11-19 15:10:20.157 | NULL         | 1       | 10              | 0                 | NULL     | NULL             | NULL               |      7 |
|         1 |      2 |       9 | 2019-11-19 15:10:20.157 | NULL         | 1       | 10              | 0                 | NULL     | NULL             | NULL               |      8 |
|         1 |      2 |      10 | 2019-11-19 15:10:20.157 | NULL         | 1       | 10              | 0                 | NULL     | NULL             | NULL               |      9 |
|         1 |      2 |      11 | 2019-11-19 15:10:20.157 | NULL         | 1       | 10              | 0                 | NULL     | NULL             | NULL               |     10 |
+-----------+--------+---------+-------------------------+--------------+---------+-----------------+-------------------+----------+------------------+--------------------+--------+

编辑:我已经解决了我的问题

我不知道为什么要使用完全联接,所以我将用内部联接替换它。您需要行号:


我已经解决了我要问的问题。下面是我提出的问题,它解决了我的问题

select d.FOLDER_ID, d.PKG_ID, p.file_id, d.PKG_START_TIME, d.PKG_END_TIME, d.ISVALID, d.VALIDFILE_COUNT, d.INVALIDFILE_COUNT, d.ISLOADED, d.LOADEDFILE_COUNT, d.REJECTEDFILE_COUNT 

from DATA_EXCHANGE_PACKAGE d  full outer join PACKAGE_FILE p on d.PKG_ID = p.PKG_ID

where d.PKG_ID = p.PKG_ID and d.PKG_ID > (select max(d.PKG_ID) - 5 from DATA_EXCHANGE_PACKAGE d ) and d.FOLDER_ID = 1

order by PKG_START_TIME desc

这个查询基本上会遍历表并选择每个记录,直到选择了5个不同的pkg_id。我将在Python中使用此查询,并将该5值设置为参数,以便用户可以选择要返回的包的数量。我也可以不使用maxd.PKG_Id。在这个表中,每个新的包Id的值都将高于以前的包Id,因此我可能也可以使用datetime和max,但现在这个查询已经足够好了。文件夹ID值也将是一个参数。

您所说的按什么顺序选择打包ID记录的数量是什么意思?随机?我希望顺序是下降的。我刚刚意识到我的问题措辞不当,很抱歉我的措辞不当,我将编辑我的原始问题以修复混乱。我想写的是,我只想选择不同的pkg_id,但我想为这些不同的pkg_id选择每个文件的id。所以如果我只想选择前两个pkg_id的话。然后,应该选择这两个pkg_id的每个文件id。我仍然支持你的答案,因为混淆是我的错,对不起。@CanadianBeaver这不是1对多关系查询的工作方式,如果你想要每个包的每个文件id,那么会有重复的pkg id。你的问题仍然不清楚。我同意重复pkg_id。例如,在上面的下表中,如果我只想为前两个不同的pkg_id选择每个文件的id,那么我希望我的查询能够做到这一点。或者,如果我想为前5个不同的包选择每个文件id,那么我也愿意这样做。我将在原始图表下方制作另一个图表,显示我希望查询执行的操作。
select d.FOLDER_ID, d.PKG_ID, p.file_id, d.PKG_START_TIME, d.PKG_END_TIME, d.ISVALID, d.VALIDFILE_COUNT, d.INVALIDFILE_COUNT, d.ISLOADED, d.LOADEDFILE_COUNT, d.REJECTEDFILE_COUNT 

from DATA_EXCHANGE_PACKAGE d  full outer join PACKAGE_FILE p on d.PKG_ID = p.PKG_ID

where d.PKG_ID = p.PKG_ID and d.PKG_ID > (select max(d.PKG_ID) - 5 from DATA_EXCHANGE_PACKAGE d ) and d.FOLDER_ID = 1

order by PKG_START_TIME desc