Проверить, нет ли значения из таблицы в других таблицах SQL - PullRequest
0 голосов
/ 06 мая 2020

У меня есть база данных с большим количеством таблиц, и я должен проверить, является ли имя из выбранной таблицы другими таблицами.

Например, предположим, что наша база данных содержит 4 таблицы (называемые Laptop1, Laptop2, Laptop3 и Laptop4), и каждая таблица определяет портативный компьютер. Таким образом, он содержит имя, дату, модель. Я могу выбрать таблицу Laptop1 и проверить, не существует ли Laptop1.name в Laptop2, Laptop3 или Laptop4.

Я работаю в SQL, а приложение написано в C#.

Заранее спасибо!

Ответы [ 4 ]

0 голосов
/ 06 мая 2020

Вы можете использовать предложение EXCEPT для получения имен портативных компьютеров, которых нет в других таблицах.

SELECT Name FROM Laptop1
EXCEPT
(
SELECT Name FROM Laptop2
UNION ALL
SELECT Name FROM Laptop3
UNION ALL
SELECT Name FROM Laptop4)

В идеале у вас не должно быть нескольких таблиц, содержащих информацию о портативных компьютерах. В реляционной модели Ноутбук - это набор, который содержит набор портативных компьютеров. Вы можете отличить портативный компьютер с помощью уникального ключа, называемого первичным ключом. Сначала определите одну таблицу портативного компьютера и загрузите уникальные данные. Таблица теперь содержит уникальную информацию о ноутбуках

CREATE TABLE Laptop(Id INT IDENTITY(1,1) NOT NULL PRIMARY KEY, Name VARCHAR(30) NOT NULL, LaptopModelDate DATE NOT NULL, Model VARCHAR(30) NOT NULL)

INSERT INTO Laptop(Name, LaptopModelDate,Model)
SELECT Name,Date,Model FROM Laptop1
UNION
SELECT Name,Date,Model FROM Laptop2
UNION
SELECT Name,Date,Model FROM Laptop3
UNION
SELECT Name,Date,Model FROM Laptop4
0 голосов
/ 06 мая 2020

Вы действительно могли бы использовать не существует. Но я согласен с Зохаром Пеледом: архитектура не кажется актуальной. У вас должны быть все ноутбуки в одной таблице. Не забывайте, что проверка отсутствия будет стоить много ввода-вывода, особенно при использовании varchar. Если вы все еще go таким образом: - проверьте свои индексы. Возможно, вам понадобится индекс в столбце имени обеих таблиц - иногда использование внутреннего соединения более производительно в последних версиях сервера sql из-за плана выполнения, который изменится, даже если результат будет таким же. Он вернет результаты, которые существуют только в 4 таблицах:

    select id from laptop1 l1
    Inner join laptop2 l2 on l1.name = l2.name
    Inner join... 

-> null, если имя не было найдено в одной таблице.

Но все равно это не будет работать в все, и если бы вы могли, вам следует ознакомиться с архитектором

0 голосов
/ 06 мая 2020

Для реальной базы данных вы должны поработать над ее исправлением. За исключением этого, я бы рекомендовал создать представление в базе данных:

create view v_laptops as
    select name, date, model, 1 as which from laptop1 union all
    select name, date, model, 2 from laptop2 union all
    select name, date, model, 3 from laptop3 union all
    select name, date, model, 4 from laptop4;

Затем используйте представление в ваших запросах:

select ot.*, l.*
from othertable ot join
     v_laptops l
     on ot.name = l.name;

Возможно, вы захотите поговорить с мастерами базы данных про исправление модели данных. Разделение информации по нескольким таблицам обычно является плохой идеей.

Вы действительно не хотите иметь дело с кучей разных таблиц и похожим кодом, на который ссылаются в нескольких запросах. Это похоже на кошмар обслуживания. Представления могут помочь изолировать такие проблемы дизайна от пользователей.

0 голосов
/ 06 мая 2020

Вы можете использовать not exists:

select l1.*
from laptop1 l1
where 
    not exists (select 1 from laptop2 l2 where l2.name = l1.name)
    and not exists (select 1 from laptop3 l3 where l3.name = l2.name)
    and not exists (select 1 from laptop4 l4 where l4.name = l2.name)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...