【问题标题】:Joint tables except the empty records (null)除空记录外的联表(空)
【发布时间】:2019-06-27 12:48:26
【问题描述】:

我有两张表(1-N 关系)。

(ID,姓名,姓氏),

(ID、工作、角色、社会)。

在我的应用程序中,我想合并 table1 和 table2(基于绑定两个表的 id)但我想隐藏可能为空的列。

示例:(在这种情况下,我不想显示 'ruolo/grado')

我是如何为此编写代码的:

CREATE PROCEDURE spEstraiPbyId
    @Id int 
    as
    begin
    SELECT * from Persone  
    join Lavori on Persone.Id = @Id and Lavori.IdPersona=@Id
    end

PS:我已经在网上看到了几个类似的问题,但没有答案能够满足我的要求,或者我没有正确理解。我希望你能心甘情愿地帮助我。

【问题讨论】:

  • 与普通的SELECT 查询一样,您不需要执行SELECT *,而是可以指定特定的列。这就是你所追求的吗?
  • 或者使用WHERE column IS NOT NULL?
  • @BrootsWaymb 这样做我必须为每个 ID 编写一个查询(有时 here 有一个空值,而 there 有一个空值)。
  • 所以如果至少有一行在列中有NULL,你需要排除整列吗?或者如果无论真实数据是什么样的, col 都被声明为可以为空,则排除它?
  • 您使用的是哪个 dbms? (该代码是特定于产品的。)

标签: c# sql asp.net sql-null


【解决方案1】:

如果我理解正确,你想做这样的事情: http://sqlfiddle.com/#!18/04141/3

SELECT * from Persone  
join Lavori on Persone.Id = Lavori.IdPersona where Lavori.Job is not null

首先,使用 on 加入键,然后用 where 过滤那些不为空的:)

【讨论】:

  • 我试过但这样做,如果工作为空,我看不到任何记录(没有结果)。相反,我想查看除空值之外的记录。
【解决方案2】:

谢谢大家。最好的提示是由@Serg 编写的,因为为此我在客户端工作,使用 DataReader 和 Datatable objs:

 DataTable tbl = new DataTable()    
SqlCommand cmd = new SqlCommand("spEstraiPById", cnn); //See at the end for spEstraiPById
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.AddWithValue("Id",txtNickname.Text);
                    using (SqlDataReader rdr = cmd.ExecuteReader())
                    { //Add columns to the table
                        tbl.Columns.Add("ID");
                        tbl.Columns.Add("Nome");
                        tbl.Columns.Add("Cognome");
                        tbl.Columns.Add("Residenza");
                        tbl.Columns.Add("Professione");
                        tbl.Columns.Add("Ruolo");
                        tbl.Columns.Add("Società");

                        while (rdr.Read())
                        { //from DB to Table
                            DataRow drw = tbl.NewRow();
                            drw["ID"] = rdr["Id"];
                            drw["Nome"] = rdr["Nome"];
                            drw["Cognome"] = rdr["Cognome"];
                            drw["Residenza"] = rdr["Residenza"];
                            drw["Professione"] = rdr["Professione"];
                            drw["Ruolo"] = rdr["Ruolo/Grado"];
                            drw["Società"] = rdr["Società"];
                            tbl.Rows.Add(drw);
                        }
                        foreach (DataRow row in tbl.Rows) //Deleting empty records
                        {
                            for (int col = tbl.Columns.Count - 1; col >= 0; col--)
                            {
                                if (row.IsNull(col))
                                {
                                    tbl.Columns.RemoveAt(col);
                                }
                            }
                            // No need to continue if we removed all the columns
                            if (tbl.Columns.Count == 0)
                                break;
                        }
                    }
                        gw1.DataSource = tbl;
                        gw1.DataBind();
                        cnn.Close();
//=Stored Procedure 
CREATE PROCEDURE spEstraiPbyId
    @Id int 
    as
    begin
    SELECT * from Persone 
    join Lavori on Persone.Id = @Id and Lavori.IdPersona=@Id
    end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-20
    • 2015-06-15
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 2022-10-14
    相关资源
    最近更新 更多