РЕДАКТИРОВАТЬ: с тех пор я редактировал запрос, используя JOINS вместо предложения WHERE в свете предлагаемых комментариев.Я использовал предложение WHERE вместо JOIN, потому что я не мог заставить его работать с тремя таблицами, но понял это.Я также вставил SELECT DISTINCT, потому что это решает проблему.Спасибо @MichaelEvanchik и @SeanLange за помощь.Я все еще учусь, и надеюсь, что я вас не расстраиваю, ребята.
Я просмотрел многократные ответные темы и, похоже, не нашел ответа, который бы мне помог.
У меня 4 таблицы.
table1
ID Cat1_Name1 Cat1_Name2 Cat2_Name1 Cat2_Name2
12 Mike Mike George Mike
13 Jen Jen Amy Amy
14 Jeff Jen Mike Ben
15 Jeff Jeff Fred Tom
16 George Jen Luke Amy
table2
ID Cat1_Name1 Cat1_Name2 Cat2_Name1 Cat2_Name2
25 Mike Mike Jen George
table3
Name Cat1_Value Cat2_Value
Mike 6.5 20.25
Jen 10.2 0.5
Jeff 11.5 1.5
George 8.0 27.1
table4
Name Cat1_Value Cat2_Value
Mike 7.8 20.0
Jen 6.0 13.0
Jeff 13.2 5.0
George 8.0 1.2
Прежде чем кто-либо спросит, набор имен в таблице2 должен отделиться от таблицы1.Это не дублирующая информация, а ЕДИНЫЙ НЕИЗВЕСТНЫЙ НАБОР, который будет сравниваться с каждой записью в таблице1, которая может содержать миллионы известных наборов (т. Е. Никакие идентификаторы в таблице1 никогда не будут совпадать с идентификаторами в таблице2).Если вы посмотрите на таблицы, то увидите, что набор имен МОЖЕТ совпадать между таблицами 1 и 2, но не обязательно.Например, имена для cat1 совпадают между таблицами 1 и 2 для идентификаторов 12 и 25 (все 4 - Майк), но не совпадают между идентификаторами 13, 14, 15, 16 и 25 (только два из 25 - Майк),В то время как в cat2 идентификаторы 12 и 25 совпадают частично (то есть имена в cat2 между таблицами 1 и 2 содержат имя George, но не совпадают во втором имени).Здесь я показываю две категории.Для одной записи будет более 30 категорий имен, но сейчас я остановлюсь на 1, чтобы решить эту конкретную проблему.Cat1_Name1, Cat1_Name2.Я буду беспокоиться об агрегации различных категорий и комбинаций логических имен с JOIN и UNION и позже отвечу на другой мой вопрос ... * с радостью.
Я хочу создать новую таблицу, которая возвращает идентификатор из таблицы table1 со связанным значениемдля каждой категории в зависимости от того, сколько имен совпадают в категории.Например, поскольку cat1_name 1 и 2 в table1 являются mike, mike И cat1_name 1 и 2 в table2 являются mike, mike, возвращают идентификатор из таблицы 1 (12) и значение в таблице 3 для cat1 (6.5).Различные наборы совпадающих имен будут возвращать значения из разных таблиц (т. Е. Частично совпадающий набор в cat2 между 12 и 25 может возвращать значение из table4 и т. Д.).Я задавал подобный вопрос по этому поводу ранее, но проблема была в другом:
Возвращение результатов из разных таблиц в зависимости от условий из двух других таблиц
У меня есть частичноеОтветьте за это, но теперь есть другая проблема.Я планирую опубликовать ответ на первый, как только я выясню эту проблему (надеюсь, с небольшой помощью ).
Вот мой запрос:
SELECT DISTINCT dbo.table1.ID, dbo.table3.Cat1_Value
INTO Cat1Table
FROM dbo.table2
INNER JOIN dbo.table3 ON (dbo.table1.Cat1_Name1 = dbo.table3.Name ) AND
(dbo.table1.Cat1_Name2 = dbo.table3.Name )
INNER JOIN dbo.table1 ON (dbo.table2.Cat2_Name1 = dbo.table3.Name ) AND
(dbo.table2.Cat2_Name2 = dbo.table3.Name )
Таблица результатов, которую я хочу:
Cat1Table
ID Cat1_Value
12 6.5
Что я получаю:
Cat1Table
ID Cat1_Value
12 6.5
12 6.5
Почему я получаю дубликат?Это моя логика или я упускаю что-то еще более простое?Если я использую SELECT DISTINCT, это дает мне правильный результат, но я думаю, что может быть более эффективный способ, потому что он будет расширен до миллионов записей.Разве SELECT DISTINCT не замедлит все?