Sql 如何连接显示表A不在表B中的所有记录的两个表

Sql 如何连接显示表A不在表B中的所有记录的两个表,sql,Sql,我有一个电子邮件营销网络应用程序。我想显示(表B)中的哪些电子邮件联系人没有出现在EmailContacts_活动(表A)中。此外,我还希望通过“活动ID”字段筛选表A。当我运行下面的代码时,我得到0条记录,但我知道那里有几千条记录。谁能告诉我我把事情搞砸了吗 SELECT * FROM TableA LEFT JOIN TableB ON TableA.EmailContactId = TableB.EmailContactId WHERE TableA.CampaignId = 1 AN

我有一个电子邮件营销网络应用程序。我想显示(表B)中的哪些电子邮件联系人没有出现在EmailContacts_活动(表A)中。此外,我还希望通过“活动ID”字段筛选表A。当我运行下面的代码时,我得到0条记录,但我知道那里有几千条记录。谁能告诉我我把事情搞砸了吗

SELECT * FROM TableA
LEFT JOIN TableB 
ON TableA.EmailContactId = TableB.EmailContactId
WHERE TableA.CampaignId = 1 
AND TableB.EmailContactId IS NULL
ORDER BY TableB.EmailContactId DESC
我想在
EmailContact
表中显示所有未在
EmailContactCampaign
表中显示的电子邮件联系人。以下是实际代码:

public List<EmailContact> GetNotAssignedContactsForCampaign(int campaignId)
        {
            string sqlCommand = "SELECT * FROM EmailContactCampaign LEFT JOIN EmailContact";
            sqlCommand += " ON EmailContactCampaign.EmailContact_EmailContactId = EmailContact.EmailContactId";
            sqlCommand += " WHERE EmailContactCampaign.EmailContact_EmailContactId = " + campaignId.ToString() AND EmailContact.EmailContactId IS NULL ;
            sqlCommand += " ORDER BY EmailContact.EmailContactId DESC";
            var emailContacts = new List<EmailContact>();

            string CS = db.Database.Connection.ConnectionString;
            using (SqlConnection con = new SqlConnection(CS))
            {
                con.Open();
                SqlCommand cmd = new SqlCommand(sqlCommand, con);
                //Create sql datareader
                using (SqlDataReader sqlDataReader = cmd.ExecuteReader())
                {
                    while (sqlDataReader.Read())
                    {
                        var emailContact = new EmailContact();
                        emailContact.Assigned = ((bool)sqlDataReader["Assigned"]);
                        emailContact.Cell1 = _crypto.DecryptAndSanitize(sqlDataReader["Cell1"] as string);
                        emailContact.Cell2 = _crypto.DecryptAndSanitize(sqlDataReader["Cell2"] as string);
                        emailContact.City = _crypto.DecryptAndSanitize(sqlDataReader["City"] as string);
                        emailContact.Company = _crypto.DecryptAndSanitize(sqlDataReader["Company"] as string);
                        emailContact.EmailAddress = _crypto.DecryptAndSanitize(sqlDataReader["EmailAddress"] as string);
                        emailContact.EmailContactId = (int)sqlDataReader["EmailContactId"];
                        emailContact.FullName = _crypto.DecryptAndSanitize(sqlDataReader["FullName"] as string);
                        emailContact.Hold = (bool)sqlDataReader["Hold"];
                        emailContact.Phone1 = _crypto.DecryptAndSanitize(sqlDataReader["Phone1"] as string);
                        emailContact.Phone2 = _crypto.DecryptAndSanitize(sqlDataReader["Phone2"] as string);
                        emailContact.State = _crypto.DecryptAndSanitize(sqlDataReader["State"] as string);
                        emailContact.Status = (Status)sqlDataReader["Status"];
                        emailContact.Zip = _crypto.DecryptAndSanitize(sqlDataReader["Zip"] as string);
                        emailContacts.Add(emailContact);
                    }

                }
                return (emailContacts);
            }
        }
public List getnotassignedcontactsforcompaign(int-activitid)
{
string sqlCommand=“选择*来自EmailContactCampaign LEFT加入EmailContact”;
sqlCommand+=“ON-EmailContactCampaign.EmailContact\u EmailContactId=EmailContact.EmailContactId”;
sqlCommand+=“其中EmailContactCampaign.EmailContact_EmailContactId=“+campaignId.ToString()和EmailContact.EmailContactId为空;
sqlCommand+=“按EmailContact.EmailContactId描述订购”;
var emailContacts=新列表();
字符串CS=db.Database.Connection.ConnectionString;
使用(SqlConnection con=newsqlconnection(CS))
{
con.Open();
SqlCommand cmd=新的SqlCommand(SqlCommand,con);
//创建sql数据读取器
使用(SqlDataReader SqlDataReader=cmd.ExecuteReader())
{
while(sqlDataReader.Read())
{
var emailContact=新的emailContact();
emailContact.Assigned=((bool)sqlDataReader[“Assigned”]);
emailContact.Cell1=\u crypto.DecryptAndSanitize(sqlDataReader[“Cell1”]作为字符串);
emailContact.Cell2=\u crypto.DecryptAndSanitize(sqlDataReader[“Cell2”]作为字符串);
emailContact.City=_crypto.decryptandsonize(sqlDataReader[“City”]作为字符串);
emailContact.Company=_crypto.decryptandsonize(sqlDataReader[“Company”]作为字符串);
emailContact.EmailAddress=\u crypto.DecryptAndSanitize(sqlDataReader[“EmailAddress”]作为字符串);
emailContact.EmailContactId=(int)sqlDataReader[“EmailContactId”];
emailContact.FullName=\u crypto.DecryptAndSanitize(sqlDataReader[“FullName”]作为字符串);
emailContact.Hold=(bool)sqlDataReader[“Hold”];
emailContact.Phone1=\u crypto.DecryptAndSanitize(sqlDataReader[“Phone1”]作为字符串);
emailContact.Phone2=\u crypto.DecryptAndSanitize(sqlDataReader[“Phone2”]作为字符串);
emailContact.State=_crypto.decryptandsonize(sqlDataReader[“State”]作为字符串);
emailContact.Status=(Status)sqlDataReader[“Status”];
emailContact.Zip=_crypto.decryptandsonize(sqlDataReader[“Zip”]作为字符串);
emailContacts.Add(emailContact);
}
}
返回(电子邮件联系人);
}
}
您试过这个吗

SELECT * FROM tableB WHERE EmailContactId NOT IN (SELECT EmailContactId FROM tableA)

我认为您得到0可能是因为这
和TableB.EmailContactId为NULL

请试试这个

SELECT * FROM TableA
LEFT JOIN TableB 
ON TableA.EmailContactId = TableB.EmailContactId
WHERE TableA.CampaignId = 1
ORDER BY TableB.EmailContactId DESC

对不起,我的问题不够清楚。做了一些挖掘,在另一篇帖子上找到了答案。对不起,我不小心把它关了,再也找不到了。无论如何,这是我的实现

SELECT * FROM EmailContact
WHERE NOT EXISTS
(SELECT * FROM EmailContactCampaign WHERE EmailContactCampaign.EmailContact_EmailContactId = EmailContact.EmailContactId AND EmailContactCampaign.Campaign_CampaignId = 1)

如果我正确理解了您的问题,您正在查找不在A中的B。但您的查询将返回不在B中的A。将其转过来(
tableB left join tableA,其中A…为NULL
)您的问题在于您的查询方式错误:您的查询将返回
EmailContactCampaign
中不在
EmailContact
中的所有联系人

您的问题的正确解决方案如下所示:

SELECT * FROM EmailContact
WHERE EmailContactId NOT IN (
  SELECT EmailContact_EmailContactId FROM EmailContactCampaign
  WHERE Campaign_CampaignId = ?
)
ORDER BY EmailContact.EmailContactId DESC

你的问题中是否有关于
SELECT*FROM TableA
的引文,或者这是打字错误?