You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL中如何为每个特定值选取单条记录?多表查询合并实现

合并SQL查询实现你的需求方案

当然可以把这些条件合并成一个查询!而且用窗口函数的方式能很清晰地实现你要的逻辑,同时保证每个符合要求的MediaID只返回对应表2里的Top1记录。

推荐方案(适用于支持窗口函数的数据库:SQL Server、MySQL 8+、PostgreSQL等)

用CTE(公共表表达式)结合ROW_NUMBER()窗口函数来实现,逻辑清晰且性能稳定:

WITH RankedMediaRecords AS (
    SELECT 
        t2.*,
        -- 按MediaID分组,每组内按NewIndex降序排名
        ROW_NUMBER() OVER (PARTITION BY t2.MediaID ORDER BY t2.NewIndex DESC) AS RecordRank
    FROM Table2 t2
    -- 关联表1,获取对应的CurrentIndex和isUsing状态
    INNER JOIN Table1 t1 
        ON t2.MediaID = t1.MediaID
    WHERE 
        -- 筛选表1中isUsing为null或false的记录
        (t1.isUsing IS NULL OR t1.isUsing = 0) -- 注意:如果isUsing是bit类型,false对应0;如果是字符串类型,改成'false'
        -- 筛选表2中NewIndex大于表1CurrentIndex的记录
        AND t2.NewIndex > t1.CurrentIndex
)
-- 取每个MediaID排名第一的记录
SELECT * 
FROM RankedMediaRecords 
WHERE RecordRank = 1;

针对不支持窗口函数的老版本数据库(比如MySQL 5.x)

如果你的数据库不支持窗口函数,可以用NOT EXISTS子查询来实现相同逻辑:

SELECT t2.*
FROM Table2 t2
INNER JOIN Table1 t1 
    ON t2.MediaID = t1.MediaID
WHERE 
    (t1.isUsing IS NULL OR t1.isUsing = 0)
    AND t2.NewIndex > t1.CurrentIndex
    -- 确保当前记录是该MediaID下NewIndex最大的符合条件的记录
    AND NOT EXISTS (
        SELECT 1 
        FROM Table2 t2_dup 
        WHERE t2_dup.MediaID = t2.MediaID 
          AND t2_dup.NewIndex > t2.NewIndex
          AND t2_dup.NewIndex > (SELECT CurrentIndex FROM Table1 WHERE MediaID = t2_dup.MediaID)
    );

在C#中执行的注意事项

你只需要把上面的SQL语句作为命令文本,使用对应的数据库连接对象(比如SqlConnection for SQL Server、MySqlConnection for MySQL)创建DbCommand,然后执行并读取结果即可。举个简单的SQL Server示例:

string sqlQuery = @"WITH RankedMediaRecords AS (
    SELECT 
        t2.*,
        ROW_NUMBER() OVER (PARTITION BY t2.MediaID ORDER BY t2.NewIndex DESC) AS RecordRank
    FROM Table2 t2
    INNER JOIN Table1 t1 
        ON t2.MediaID = t1.MediaID
    WHERE 
        (t1.isUsing IS NULL OR t1.isUsing = 0)
        AND t2.NewIndex > t1.CurrentIndex
)
SELECT * FROM RankedMediaRecords WHERE RecordRank = 1;";

using (SqlConnection conn = new SqlConnection("你的数据库连接字符串"))
{
    conn.Open();
    using (SqlCommand cmd = new SqlCommand(sqlQuery, conn))
    {
        using (SqlDataReader reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                // 按需处理每条返回的记录,比如读取字段值
                int table2Id = reader.GetInt32(reader.GetOrdinal("Table2ID"));
                // ...其他字段处理
            }
        }
    }
}

内容的提问来源于stack exchange,提问作者alan samuel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:26:10