SQL - идентификация точных совпадений в нескольких записях -- sql поле с участием ms-access пол Связанный проблема

SQL - identifying exact matches across multiple records


3
vote

проблема

русский

Стол родитель

 <код> Column1 S1 S2 S3   

таблица ребенка

 <код> Column1     Column2 S1          P1 S1          P2 S2          P1 S2          P2 S3          P1   

Где Parent.Column1 = Child.Column1

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

Например, S1 и S2 имеют P1 и P2, так что соответствует условию. S3, однако, не имеет P2, и поэтому следует исключить.

Новое на SQL, поэтому у меня есть проблемы. Пробовал, используя не в операторе, но поскольку S3 имеет P1, он не исключается.

Английский оригинал

Table Parent

Column1 S1 S2 S3 

Table Child

Column1     Column2 S1          P1 S1          P2 S2          P1 S2          P2 S3          P1 

Where parent.column1 = child.column1

Given the above tables, I need to identify the parents whose children have the same records in column2 as parent S1 does.

For example, S1 and S2 both have P1 and P2, so that would meet the condition. S3, however, does not have P2, and should therefore be excluded.

New to SQL, so I'm having some trouble. Tried it by using a not in statement, but since S3 has P1, it's not being excluded.

</div
     
 
 

Список ответов

1
 
vote

Вам нужно присоединиться. Это будет варьироваться от диалекта SQL. Что-то вроде:

 <код> select child.column1, child.column2 from (   select column2 as parentsColumn2Value from child where column1='S1' ) as parentsColumn2Table left join child on parentsColumn2Table.column2=child.column2   
 

You need a join. This will vary by SQL dialect. Something like:

select child.column1, child.column2 from (   select column2 as parentsColumn2Value from child where column1='S1' ) as parentsColumn2Table left join child on parentsColumn2Table.column2=child.column2 
</div
 
 
1
 
vote
<Р> Решение это в общем случае нахождения всех подходящих родителей больше удовольствия :) См примечание в нижней части для того, как это может быть использовано для более простого случая (один из родительских ключей фиксировано). <Р> Я дам то, что я думаю, что это «правильное» решение, но я не имею копию доступа (или SQL Server) под рукой, чтобы увидеть, если он работает там. (Да, я проверил это против БД здесь, хотя ...)
 <код> SELECT p1.column1, p2.column1 FROM parent p1 JOIN parent p2 ON p1.column1 < p2.column1 WHERE NOT EXISTS (SELECT 1        FROM (SELECT c1.column1, c1.column2 FROM child c1 WHERE c1.column1 = p1.column1) c1f             FULL OUTER JOIN             (SELECT c2.column1, c2.column2 FROM child c2 WHERE c2.column1 = p2.column1) c2f             ON c1f.column2 = c2f.column2        WHERE c1f.column1 IS NULL OR c2f.column1 IS NULL       );   
<Р> Итак, мы надеемся, вы можете увидеть, как я сказал выше, связаны друг с другом в этом :) Я попытаюсь объяснить ... <Р> «внешняя» (первый) выбор формирует комбинацию значений column1 (p1.column1 и p2.column1). Для каждой из комбинаций, мы перечислим строки в «ребенок» для этих значений (это C1F и C2F: C1F означает «ребенок 1 фильтруется») и сделать FULL OUTER JOIN. Который является сравнительно редким конструкт, в моем опыте. Мы хотим, чтобы совпасть все записи в C1F и C2F (используя их значения COLUMN1), и найти какой-нибудь по обе стороны , который не имеет соответствующую запись на другой боковая сторона. Если есть какие-то такие не-matchers, то они будут проявляться в виде рядов от объединения с нулем для их COLUMN1 значения. Таким образом, выбирает родительский запрос только комбинации значений column1, где нет таких строк в подзапросах существуют, то есть каждый ребенок строка для значения column1 p1 имеет соответствующий ребенок строка для значения column1 р2 и наоборот. <Р> Так, например, для итерации, где p1.column1 есть «S1» и p2.column2 есть «S3», что подзапрос (без агрегации) будет производить:
 <код>  c1f__column1 | c1f__column2 | c2f__column1 | c2f__column2 --------------+--------------+--------------+--------------  S1           | P1           | S3           | P1  S1           | P2           |              |   
<Р> и это те нули во втором ряду, что флаг этой комбинации не соответствие. Некоторые извилистой мышление вовлечены, это заманчиво получить зациклены на поиске комбинации соответствия, при нахождении несовпадающих из них проще. <Р> В качестве последнего бонуса, когда я создал несколько тестовых таблиц для этого, я сделал (COLUMN1, COLUMN2) первичный ключ ребенка, который просто так случилось, что именно то, что вам нужно водить полное внешнее соединение отфильтрованных таблиц эффективно. Победить! (Точно так же к сведению, я не пытался справиться с повторяющимися комбинациями в ребенка ... но вы можете просто пощечина «отличный» в C1F и C2F отведениях) <Р> NB на основе комментария Мэтта, если один из ваших родительских ценностей была известна (т.е. вы просто хотели, чтобы перечислить все родительские ценности с теми же детьми, как S1), то вы можете просто хлопнуть «и p1.column1 =„S1"» на конце этого. Но заменить «родитель p1 РЕГИСТРИРУЙТЕСЬ родительскую P2 на p1.column1 & лт; p2.column1» только с «родительским p1, p2 Родитель» в этом случае ... помните, что в противном случае запрос, как написано будет выводиться только половина всех возможных пар. ..
 

Solving this for the general case of finding all the matching parents is more fun :) See note at the bottom for how this can be used for the simpler case (one of the parent keys is fixed).

I'll give what I think is a "proper" solution, but I don't have a copy of Access (or SQL Server) to hand to see if it works in there. (Yes, I have tested this against a DB here though...)

SELECT p1.column1, p2.column1 FROM parent p1 JOIN parent p2 ON p1.column1 < p2.column1 WHERE NOT EXISTS (SELECT 1        FROM (SELECT c1.column1, c1.column2 FROM child c1 WHERE c1.column1 = p1.column1) c1f             FULL OUTER JOIN             (SELECT c2.column1, c2.column2 FROM child c2 WHERE c2.column1 = p2.column1) c2f             ON c1f.column2 = c2f.column2        WHERE c1f.column1 IS NULL OR c2f.column1 IS NULL       ); 

So hopefully you can see how what I said above is tied together in this :) I'll try to explain...

The "outer" (first) select generates combinations of column1 values (p1.column1 and p2.column1). For each of the combinations, we list the rows in "child" for those values (these are c1f and c2f: c1f means "child 1 filtered") and do a FULL OUTER JOIN. Which is a comparatively rare construct, in my experience. We want to match up all the entries in c1f and c2f (using their column1 values), and find any on either side that doesn't have a corresponding entry on the other side. If there are any such non-matchers then they will manifest as rows from the join with a null for their column1 value. So the parent query selects only combinations of column1 values where no such rows in the subquery exist, i.e. every child row for p1's column1 value has a corresponding child row for p2's column1 value and vice versa.

So for instance, for the iteration where p1.column1 is 'S1' and p2.column2 is 'S3', that subquery (without aggregation) would produce:

 c1f__column1 | c1f__column2 | c2f__column1 | c2f__column2 --------------+--------------+--------------+--------------  S1           | P1           | S3           | P1  S1           | P2           |              | 

and it's those nulls in the second row that flag this combination as not matching. Some twisty thinking involved, it's tempting to get fixated on finding matching combinations, when finding non-matching ones is easier.

As a final bonus, when I created some test tables for this, I made (column1,column2) the primary key of child, which just so happened to be exactly what you need to drive the full outer join of the filtered tables efficiently. Win! (So do note I haven't tried to cope with duplicate combinations in child... but you could just slap "distinct" in the c1f and c2f derivations)

NB based on Matt's comment, if one of your parent values was known (i.e. you just wanted to list all the parent values with the same children as S1) then you can just slap "and p1.column1 = 'S1'" on the end of this. But replace "parent p1 JOIN parent p2 ON p1.column1 < p2.column1" with just "parent p1, parent p2" in that case... remember that otherwise the query as written will only output half of all the possible pairs...

</div
 
 
0
 
vote
<Р> Это доступ, а не решение SQL в том, что он использует в определенном пользователе функции (UDF).
 <код> SELECT p.Column1,         ConcatList("SELECT Column2 FROM c WHERE Column1='S1'","|") AS S1,         ConcatList("SELECT Column2 FROM c WHERE Column1='" & [p].[Column1] & "'","|") AS Child,         Format([S1]=[Child],"Yes/No") AS [Match] FROM p;   
<Р> ОДС
 <код>    Function ConcatList(strSQL As String, strDelim, ParamArray NameList() As Variant)    ''Reference: Microsoft DAO x.x Object Library    Dim db As Database    Dim rs As DAO.Recordset    Dim strList As String     Set db = CurrentDb     If strSQL <> "" Then        Set rs = db.OpenRecordset(strSQL)         Do While Not rs.EOF            strList = strList & strDelim & rs.Fields(0)            rs.MoveNext        Loop         strList = Mid(strList, Len(strDelim) + 1)    Else         strList = Join(NameList, strDelim)    End If     ConcatList = strList     End Function   
<Р> К сожалению, я не верю, что Jet поддерживает Full Outer Join, поэтому решение с использованием только SQL, вероятно, будет немного утомительно, и требуют больше информации, например, имеет ли S1 фиксированное количество записей в COLUMN2.
 

This is an Access, rather than an SQL solution in that it makes use of a User Defined Function (UDF).

SELECT p.Column1,         ConcatList("SELECT Column2 FROM c WHERE Column1='S1'","|") AS S1,         ConcatList("SELECT Column2 FROM c WHERE Column1='" & [p].[Column1] & "'","|") AS Child,         Format([S1]=[Child],"Yes/No") AS [Match] FROM p; 

The UDF

   Function ConcatList(strSQL As String, strDelim, ParamArray NameList() As Variant)    ''Reference: Microsoft DAO x.x Object Library    Dim db As Database    Dim rs As DAO.Recordset    Dim strList As String     Set db = CurrentDb     If strSQL <> "" Then        Set rs = db.OpenRecordset(strSQL)         Do While Not rs.EOF            strList = strList & strDelim & rs.Fields(0)            rs.MoveNext        Loop         strList = Mid(strList, Len(strDelim) + 1)    Else         strList = Join(NameList, strDelim)    End If     ConcatList = strList     End Function 

Unfortunately, I do not believe Jet supports Full Outer Join, so a solution using only SQL is likely to be a little tedious, and require more information, such as whether S1 has a fixed number of entries in column2.

</div
 
 
   
   
0
 
vote
<Р> ACE / Jet не может поддерживать FULL OUTER JOIN напрямую, но обходной путь достаточно просто т.е. UNION ВСЕ LEFT JOIN, INNER JOIN простой и RIGHT JOIN соответственно из таблиц.
 

ACE/Jet may not support FULL OUTER JOIN directly but the workaround is simple enough i.e. just UNION ALL the LEFT JOIN, INNER JOIN and RIGHT JOIN respectively of the tables.

</div
 
 
0
 
vote
<Р> Кстати, я искал то же решение и понял это сам
 <код> select * from TableParent where id in    (select temp_parent.id from     (select TableParent.*, count(exact_match.match_count) as exact_count       from TableParent      inner join         (select Column1, count(*) as match_count from TableChild         group by Column1         having match_count = 2        ) as exact_match on exact_match.Column1 = TableParent.Column1      inner join         TableChild on TableChild.event_id = exact_match.Column1 where TableChild.Column2 in (P1,P2)    group by TableParent.Column1    having exact_count = 2) as temp_parent)   
 

Incidentally, i was searching for the same solution and have figured it out myself

select * from TableParent where id in    (select temp_parent.id from     (select TableParent.*, count(exact_match.match_count) as exact_count       from TableParent      inner join         (select Column1, count(*) as match_count from TableChild         group by Column1         having match_count = 2        ) as exact_match on exact_match.Column1 = TableParent.Column1      inner join         TableChild on TableChild.event_id = exact_match.Column1 where TableChild.Column2 in (P1,P2)    group by TableParent.Column1    having exact_count = 2) as temp_parent) 
</div
 
 

Связанный проблема

1  MySQL: создать строку в таблице с истечением срока годности  ( Mysql create row in table with expiration date ) 
Hello Возможная вставьте строку в таблицу с датой истечения срока годности и когда достигнута дата истечения срока действия, поэтому строка автоматически удал...

-1  SQL Server: Дата сравнения часов  ( Sql server date to hours comparison ) 
Я хотел бы получить элементы, размещенные на заказами за последние X часов. Если таблица хранит эти данные в качестве даты, как бы я смогу получить заказы, по...

0  Обновление данных с той же первичным ключом  ( Updating data with same primary key ) 
Я читаю данные из файла CSV и добавление данных в базу данных. Во время вставки данных в базу данных я хочу обновить данные с той же первичной клавишей. e.g...

0  Что такое мой пропавший оператор в моем выражении запроса?  ( What is my missing operator in my query expression ) 
First Off, я очень новый с доступом, так что извиняюсь, если это супер базовый, но я бегу в проблему с моим запросом, и я не знаю, в чем проблема. Вот мой код...

23  Клиент браузера Microsoft SQL [Закрыто]  ( Microsoft sql browser client ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> закрыт. Этот вопрос не соответствует Рекомендациям переполнения ...

2  Как использовать Regex с JSON_EXTRACT на большом запросе  ( How to use regex with json extract on big query ) 
У меня есть поле JSON на большом настольном запросе и в настоящее время я использую следующий метод, чтобы сделать извлечение из элемента ID (например): <ко...

1  Настройте SQL PolyBase для доступа к внешним данным в MongoDB - проблема  ( Configure sql polybase to access external data in mongodb problem ) 
Я пытаюсь подключить SQL Server с помощью полибазы с MongoDB, но я не в состоянии создать внешний источник данных для этого. Пожалуйста, помогите ... Я испо...

0  Конвертировать стол в другой формат в MSSQL  ( Convert table to another format in mssql ) 
Я сталкиваюсь с проблемой с MS-SQL в получении вывода из таблицы в определенном формате. . Имя |. StringValue |. Parent_id. Полевое имя |. Testheader1 |. 3. ...

0  SQL-запрос слишком долго  ( Sql query taking too long ) 
У меня есть простая «вставка в ..». Запрос, который принимает около 40 секунд для выполнения. Он просто принимает записи из одной таблицы и вставляет в другую...

3  Выбор таблицы свойств как столбцы  ( Selecting table of properties as columns ) 
У меня есть две таблицы, <код> things и <код> properties : <код> CREATE TABLE things ( id SERIAL PRIMARY KEY ); CREATE TABLE properties ( thing_id INT...

1  Используйте SQL, чтобы выбрать поля из списков WordPress  ( Use sql to select fields from wordpress listings ) 
Я использую тему WordPress, которая может хранить много информации, которую я довольно увлекаюсь доступом. Я пытаюсь получить доступ к широте и долготе (кот...

2  SQL Table в другую базу данных  ( Sql table to another database ) 
У меня есть 2 баз данных на SQL (идентично). Я хочу, чтобы таблица из одной базы данных была скопирована в другую базу данных. Они как одно и то же имя, и ори...

0  .NET Условно используют библиотеку .NET, если установлено  ( Net conditionally use a net library if installed ) 
Мой вопрос довольно просто. Я хочу добавить новый раздел в мой проект, который будет использоваться библиотеки SMO ​​.NET (объект управления SQL Server). Я сч...

0  Сервер SQL Server Rowing Rows Mathet - без «заказа»  ( Sql server paging rows by offset without order by ) 
Производственный стол мой содержит более миллиона записей. Требование требует для поискового запроса для извлечения записей по смещению и предельным параметра...

0  Oracle: отключить ограничение внутри триггера  ( Oracle disable a constraint inside a trigger ) 
Извините за раздражение, возможно, глупый вопрос, но почему это утверждение: <код> ALTER TABLE SESSION_LOGGING disable CONSTRAINT fk_session_log_ben_name; ...