需要Sql查询以基于表唯一列值返回true或false

时间:2019-06-26 08:10:07

标签: sql-server

我有两个表,一个主表和一个子表,并且都包含一个唯一的列字段。如果子表在唯一列字段中包含一个不同于主表值的值,我需要返回false。

  • 表1:主服务器(主服务器始终只包含一行)
  • 唯一列是PLID,值是10

案例:1

  • 表2:儿童
  • 唯一列是PLID

它包含3行

PLID
====
10
20
30

然后它包含主表PLID以外的唯一字段值,因此我需要返回False

案例:2

  • 表2:儿童
  • 唯一列是PLID

它包含3行

PLID
====
10
10
10

案例2包含与主表相同的值,因此需要返回True

为此需要SQL中的函数。

6 个答案:

答案 0 :(得分:0)

修改

原始问题用sql标记(指ANSI SQL),并且此答案使用标准的ANSI SQL。

但是事实证明,正在使用的DBMS是SQL Server,并且不支持类似的boolean表达式。此答案不适用于Microsoft SQL Server

但是,我仍然将答案留给参考。


您可以使用具有NOT EXISTS条件的关联查询:

select plid, not exists (select *
                         from child_table ct
                         where ct.plid <> mt.plid) as has_no_other_values
from master_table mt;

在线示例:https://rextester.com/EYWXLQ53937

答案 1 :(得分:0)

首先,您可以使用LEFT JOIN查找一个表中存在的任何行,而不是另一个表中的行。

然后可以使用EXISTS子句检查该查询是否返回任何行。

尽管许多SQL方言没有布尔类型,在这种情况下,您可以将它们全部包装在CASE表达式中。

SELECT
  CASE WHEN
    EXISTS (
      SELECT *
        FROM table_child   c
   LEFT JOIN table_parent  p
          ON p.PLID = c.PLID
       WHERE p.PLID IS NULL
    )
  THEN
    0
  ELSE
    1
  END

答案 2 :(得分:0)

select case
    when 
    (select Count(select 1 from childTable as c where c.PLID = (select PLID from masterTable) )) = (select Count(*) from childTable)
    then 'True'
    else 'False'
    end

答案 3 :(得分:0)

select c.plid, case when p.plid is null then 0 else 1 end as match
from child c
left outer join parent p in p.plid = c.plid

从子项中选择一个并将其加入父项,使父项与具有相同plid的子项匹配。但是,“左外部联接”将返回未找到匹配父项的子行。从该批次中,父级plid为空-也就是说,找不到匹配的父级行-显示0,否则显示1。

答案 4 :(得分:0)

之前未提及的另一种选择是将LEFT JOIN条件下的突击步枪与IF(ISNULL)一起使用。

SELECT IF(ISNULL(child.PLID,1,0))
FROM table_parent parent
LEFT JOIN table_child child ON child.PLID != parent.PLID
LIMIT 1

答案 5 :(得分:0)

从中选择计数(*) (从MasterPKID = 800的Child中选择max(ChildPKID)作为ID 按PLID分组)