我有两张桌子可供一个人使用。我想在每张桌子上找到他们的实例并将它们结合在一起。我希望工会将在两个表上找到此人的所有实例,并删除任何冗余实例。因此,如果一个人在桌子A而不是B,他们会出现。反之亦然,他们仍然会出现。如果他们同时出现,他们会出现。但我只想在结果集中有一个人的实例。现在,根据我在数据库中看到的数据,该人在两个表中都有一个实例,但在其他情况下可能有更多实例。这应该返回一行,而不是两行,因为应该删除冗余,但它不返回任何内容(0)。没有任何错误,查询是错误的,我误解了联合,并以某种方式获得零匹配。
SqlCommand getDrivers = new SqlCommand("SELECT DriverPhone FROM Transactions WHERE EstablishmentCode = @ec UNION SELECT PhoneNumber FROM Connection WHERE EstablishmentCode = @ec AND Dispatcher = @disp", myTransactions);
getDrivers.Parameters.AddWithValue("@ec", "ec");
getDrivers.Parameters.AddWithValue("@disp", false);
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = getDrivers;
try
{
adapter.Fill(dsDrivers);
adapter.Dispose();
getDrivers.Dispose();
Response.Write(dsDrivers.Tables[0].Rows.Count.ToString());
}
catch (Exception err)
{
Response.Write("<p>" + err + "</p>");
//sb.Append("<p style='display:none'>" + err + "</p>"); // shows real error msg for debug but hides it on page
}
答案 0 :(得分:0)
如果您想要两个集合中的不同行,那么您需要类似intersect
而不是union
的内容。例如:
SELECT DriverPhone
FROM Transactions
WHERE EstablishmentCode = @ec
INTERSECT
SELECT PhoneNumber
FROM Connection
WHERE EstablishmentCode = @ec AND Dispatcher = @disp;
您可以在documentation中了解INTERSECT
。
如果您的数据库不支持intersect
,那么只需使用条件逻辑:
SELECT DISTINCT DriverPhone
FROM Transactions
WHERE EstablishmentCode = @ec AND
DriverPhone IN (SELECT c.PhoneNumber
FROM Connection c
WHERE c.EstablishmentCode = @ec AND c.Dispatcher = @disp
);
注意:如果SELECT DISTINCT
具有给定Transactions
的重复记录,则会使用DriverPhone
。在问题中使用UNION
表示您要删除重复项。
答案 1 :(得分:0)
getDrivers.Parameters.AddWithValue(“@ ec”,“ec”);
“ec”应该引用之前设置的字符串变量val,因此它不应该有引号。