Нужен Sql-запрос для возврата true или false на основе уникального значения столбца таблицы - PullRequest
0 голосов
/ 26 июня 2019

У меня есть две таблицы: одна основная и одна дочерняя, и обе содержат уникальное поле столбца. Мне нужно вернуть 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 голосов
/ 26 июня 2019

выберите количество (*) из (выберите max (ChildPKID) в качестве идентификатора для Child, где MasterPKID = 800 группировка по PLID) s

0 голосов
/ 26 июня 2019

Другой вариант, не упомянутый ранее, - это использование условного тогетера 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
0 голосов
/ 26 июня 2019
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. Однако 'left external join' вернет дочерние строки, в которых не найдено ни одного подходящего родителя. Из этого лота, где родительский plid равен нулю - то есть соответствующая родительская строка не была найдена - показать 0, иначе показать 1.

0 голосов
/ 26 июня 2019
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
0 голосов
/ 26 июня 2019

Во-первых, вы можете использовать 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
0 голосов
/ 26 июня 2019

Редактировать

Исходный вопрос был помечен sql (относится к ANSI SQL), и в этом ответе используется стандартный ANSI SQL.

Однако оказывается, что используемая СУБД - это SQL Server, и она не поддерживает выражения boolean, подобные этому.Этот ответ не будет работать с Microsoft SQL Server.

Но я все же оставляю ответ для справки.


Вы можете использовать связанный подзапрос с условием НЕ СУЩЕСТВУЕТ:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...