Выберите строки из двух таблиц только тогда, когда все включено - PullRequest
0 голосов
/ 03 июля 2018

У меня есть следующие таблицы

Table1

Col1 | Col2

r1c1 | r1c2

r2c1 | r2c2

r3c1 | r3c2

r4c1 | r4c2

Table2

Col1_Table1 | Col2

r1c1_table1 | r1c2

r2c1_table1 | r2c2

r3c1_table1 | r3c2

Итак, вы видите, что моя строка №4 отсутствует в Таблице 2.

Выбрать все строки из таблицы 1 и присоединиться к таблице 2. Нет проблем

Но как выглядит выбор, когда я хочу выбрать все из Таблицы1, но только если все из Таблицы1 находятся в Таблице2? Я надеюсь, что вы можете понять. В моем примере I результат выбора должен быть ноль / ноль.

Ответы [ 3 ]

0 голосов
/ 03 июля 2018

Привет Пожалуйста, смотрите пример ниже

IF OBJECT_ID('tempdb..#Table1') IS NOT NULL
BEGIN
    DROP TABLE #Table1
END

IF OBJECT_ID('tempdb..#Table2') IS NOT NULL
BEGIN
    DROP TABLE #Table2
END

CREATE TABLE #Table1 (
    Col1 NVARCHAR(20)
    , Col2 NVARCHAR(20)
    )

INSERT INTO #Table1 VALUES ('r1c1', 'r1c2')
INSERT INTO #Table1 VALUES ('r2c1', 'r2c2')
INSERT INTO #Table1 VALUES ('r3c1', 'r3c2')
INSERT INTO #Table1 VALUES ('r4c1', 'r4c2')

CREATE TABLE #Table2 (
    Col1_Table1 NVARCHAR(20)
    , Col2 NVARCHAR(20)
    )

INSERT INTO #Table2 VALUES ('r1c1_table1','r1c2')
INSERT INTO #Table2 VALUES ('r2c1_table1','r2c2')
INSERT INTO #Table2 VALUES ('r3c1_table1','r3c2')

SELECT COUNT(*) as 'Result'
FROM #Table1 AS t1
INNER JOIN #Table2 AS t2
    ON t1.Col1 = t2.Col2

IF OBJECT_ID('tempdb..#Table1') IS NOT NULL
BEGIN
    DROP TABLE #Table1
END

IF OBJECT_ID('tempdb..#Table2') IS NOT NULL
BEGIN
    DROP TABLE #Table2
END

Надеюсь, это поможет

0 голосов
/ 03 июля 2018

Если я вас правильно понимаю, вы хотите вернуть все строки таблицы 1, только если вся таблица 1 также существует в таблице 2

Так в действительности:

SELECT * FROM #table1
WHERE 
(SELECT COUNT(*) FROM #table1)
 = (SELECT COUNT(*) FROM #Table1 INNER JOIN #Table2 ON #Table1.col1 = #Table2.col1)

Это правильно? в этом случае лучший способ сделать это будет:

SELECT *
FROM #table1
WHERE NOT EXISTS (
      SELECT 1
      FROM #table1
      WHERE col1 NOT IN (SELECT col1 FROM #table2)
);
0 голосов
/ 03 июля 2018

Я думаю, что вы ищете INTERSECT.

Ex:

select Col1, Col2 from table1
INTERSECT
select Col1, Col2 from table2

Пересечение будет возвращать результаты, основанные на данных, находящихся в обеих таблицах.

Ссылка: https://docs.microsoft.com/en-us/sql/t-sql/language-elements/set-operators-except-and-intersect-transact-sql?view=sql-server-2017

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