除空记录(null)外的联合表
Joint tables except the empty records (null)
我有两个表(1-N关系)。
(身份证,姓名,姓氏),
(ID、工作、角色、社会)。
在我的应用程序中,我想合并表 1 和表 2(基于绑定两个表的 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: 我已经在网上看到了几个类似的问题,但是没有一个答案能够满足我的要求或者我没有理解正确。希望您能心甘情愿地帮助我。
如果我没理解错的话,你想做这样的事情:
http://sqlfiddle.com/#!18/04141/3
SELECT * from Persone
join Lavori on Persone.Id = Lavori.IdPersona where Lavori.Job is not null
首先,使用 on 连接键,然后使用不为空的 where 过滤 :)
谢谢大家。最好的技巧是由@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
我有两个表(1-N关系)。
在我的应用程序中,我想合并表 1 和表 2(基于绑定两个表的 ID),但我想隐藏可能为空的列。
示例:
我是如何编写代码的:
CREATE PROCEDURE spEstraiPbyId
@Id int
as
begin
SELECT * from Persone
join Lavori on Persone.Id = @Id and Lavori.IdPersona=@Id
end
PS: 我已经在网上看到了几个类似的问题,但是没有一个答案能够满足我的要求或者我没有理解正确。希望您能心甘情愿地帮助我。
如果我没理解错的话,你想做这样的事情: http://sqlfiddle.com/#!18/04141/3
SELECT * from Persone
join Lavori on Persone.Id = Lavori.IdPersona where Lavori.Job is not null
首先,使用 on 连接键,然后使用不为空的 where 过滤 :)
谢谢大家。最好的技巧是由@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