【问题标题】:Combining data from two SQL queries组合来自两个 SQL 查询的数据
【发布时间】:2012-07-05 15:07:59
【问题描述】:

我正在将我的应用程序从 Django 移植到 ASP.NET Webforms(违背我的意愿,但是我们可以对企业界做些什么..),我已经习惯 Django 生成我所有的 SQL 查询,所以现在我需要帮助。 我有 3 张桌子:proceso,marcador,marcador_progreso

每个proceso 都有很多marcador_progreso,这又是marcador 的外键表。

所以基本上表格看起来像:

proceso
    id

marcador
    id
    text

marcador_progreso
    id
    marcador_id
    proceso_id
    state

对于所有marcador_progreso,其中proceso_id 是当前过程(来自URL 中的QueryField),我需要列出它的state 和它各自的marcador.text。 我一直在使用 EntityFramework,但这就像一个双重查询,所以我不知道该怎么做。

我猜它是结合了以下两个语句的东西,但我不知道该怎么做。

SELECT [state] FROM [marcador_progreso]
SELECT [text] FROM [marcador] WHERE ([id] = marcador_id)

【问题讨论】:

    标签: asp.net sql sql-server webforms


    【解决方案1】:

    你想做一个 JOIN:

    SELECT mp.state, m.text
    FROM marcador_progreso as mp
    INNER JOIN marcador as m
    ON mp.marcador_id = m.id
    

    这是一个excellent post,涵盖各种连接类型。

    【讨论】:

    • +1,但我会使用 LEFT OUTER JOIN 翻译两个单独的选择,但根据 OP 的意图,它可以采用任何一种方式
    【解决方案2】:

    您需要了解JOINs 才能在FROM 子句中调用多个表。 JOIN 通过使用每个表共有的值来组合数据库中两个或多个表的记录。有不同的类型 - 下面的 SQL 示例是一个 INNER 连接,它只获取两个表的公共值都匹配的记录。您可能需要考虑一个 LEFT 连接,它将获取 LEFT 表(在本例中为 marcador)存在的任何记录,即使 RIGHT(marcador_progreso ) 表中没有任何匹配记录。 在 Management Studio 中弹出以下内容,使用不同的连接进行游戏。将INNER 替换为LEFT,在没有WHERE 的情况下运行它。 阅读有关“加入”的信息。

    一般来说,对于您编写自己的查询的新尝试,它们都以相同的基本结构开始: SELECT (UPDATE,WHATEVER DML statement, etc) (COLUMNS) 您想要显示的内容(更新等)
    FROM (TABLE) 这些记录所在的位置 WHERE (FILTER/LIMIT) 数据必须满足的条件 快乐取材!

    SQL:

    DECLARE @ProcessoId int
    SET @ProcessoId = --1
    
    SELECT m.[STATE],mp.[TEXT] 
    FROM marcador M
    INNER JOIN marcador_progreso MP ON MP.marcador_id = m.id
    WHERE proceso_id =  @ProcessoId
    

    EF INNER 示例

    var marc = from m in yourcontext.marcador
               join mp in yourcontext.marcador_progreso on m.id equals mp.marcador_id
               where proceso_id ==  processoIdvariable
    

    EF 左示例

      var marc = from m in yourcontext.marcador
               join mp in yourcontext.marcador_progreso on m.id equals mp.marcador_id into details
               from d in details.DefaultIfEmpty()
               where proceso_id ==  processoIdvariable
    

    【讨论】:

      猜你喜欢
      • 2020-12-22
      • 2021-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-28
      • 1970-01-01
      • 2018-06-08
      相关资源
      最近更新 更多