联盟没有像我期望的那样工作

时间:2016-10-05 17:57:21

标签: sql sql-server

我有两张桌子可供一个人使用。我想在每张桌子上找到他们的实例并将它们结合在一起。我希望工会将在两个表上找到此人的所有实例,并删除任何冗余实例。因此,如果一个人在桌子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
    } 

2 个答案:

答案 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,因此它不应该有引号。