匹配SQL Server中两个表之间的列值

匹配SQL Server中两个表之间的列值,sql,sql-server,join,Sql,Sql Server,Join,我有两张桌子: 预订名称 +-------+-------+-------+-------+ | Name | +-------+-------+-------+-------+ | Brad Pitt | | Morgan Freeman | | Bobby deniro |

我有两张桌子:

预订名称

   +-------+-------+-------+-------+  
   |            Name               |  
   +-------+-------+-------+-------+   
   | Brad Pitt                     |  
   | Morgan Freeman                |  
   | Bobby deniro                  |  
   +-------+-------+-------+-------+
预订详情

   +-------+-------+-------+-------+  
   | Name           | ID   | Eid   |  
   +-------+-------+-------+-------+   
   | Brad Pitt      | 1    | ab123 |  
   | Morgan Freeman | 2    | pq123 |  
   | Bobby deniro   | 3    | rs123 |  
   +-------+-------+-------+-------+
我必须将ReservationName中的姓名与BookingDetails匹配

如果它们相同(计数和值)

我上面的示例应该返回true,因为名称相同,计数为3。
上述条件是我在存储过程中使用的If exists逻辑的一部分。

根据我的理解,执行以下查询:

SELECT 
    COUNT(Name)
FROM 
    (SELECT R.Name
    FROM ReservationName R 
    INNER JOIN BookingDetails B ON R.Name = B.Name) A

如果这不是您正在寻找的解决方案,请详细描述问题。

根据您的要求:-

  • 检查计数是否匹配
  • 检查名称是否匹配
如果代码:-

IF (
        /*check count is matched*/
        (SELECT COUNT(Name) FROM ReservationName) = (SELECT COUNT(Name) FROM BookingDetails) 
        AND
        /*check name is matched*/
        (SELECT COUNT(Name) FROM ReservationName where Name  
            NOT IN (SELECT Name FROM BookingDetails)) = 0
    )
BEGIN
    SELECT 1 -- Name and count are matched
END
ELSE
BEGIN
    SELECT 0
END

确定哪些名称不在两个表中的一种方法是使用
完全外部联接

select *
from ReservationName rn full outer join
     BookingDetails bd
     on rn.name = bd.name
where rn.name is null or bd.name is null;
如果存在使用
功能,则可以在
中使用此功能:

if (exists (select 1
            from ReservationName rn full outer join
                 BookingDetails bd
                 on rn.name = bd.name
            where rn.name is null or bd.name is null
           )
    )
begin
    -- not matching code
end;

注意:此版本假定(如您的问题所示)每个表中的名称都是唯一的。如果情况并非如此,则询问另一个问题,并提供有关如何处理重复名称的更多信息。特别要解决的问题是,如果表之间的重复数不同,该怎么办。

您可以使用联接来匹配名称。您到底需要什么?@gaganshera:如果存在(名称和计数匹配),则将标量值设置为1计数是多少,在哪里?要求仍然不清楚。@gaganshera:为没有把事情说清楚而道歉。“名称”列必须相同。希望能澄清。在(t1.Name=t2.Name)
上执行类似于
SELECT*,count(*)Name count FROM ReservationName t1 join booking details t2的联接将返回所有匹配的行。我不明白确切的要求,但我想这就是你想要的。得到这个错误。将varchar值“BRAD PITT”转换为数据类型时,转换失败int@PiyushSing,答案已经更新,等待您的反馈。谢谢@ahmed abdelqader:在这段时间里,我在几个小时前也提出了一个答案,而且它也是工作文件。
if 
(
not exists (
SELECT Name FROM ReservationName 
EXCEPT
SELECT Name FROM BookingDetails
           )
and
not exists ( SELECT Name FROM ReservationName
             except
              SELECT Name FROM BookingDetails 
           )
)
BEGIN
    SELECT 1 -- Name and count are matched
END
ELSE
BEGIN
  SELECT 0
END