2016-02-12 4 views
1

У меня есть две таблицы. Они имеют одинаковые данные, но из разных источников. Я хотел бы найти все столбцы из обеих таблиц, где идентификатор в таблице 2 встречается более одного раза в таблице 1. Еще один способ взглянуть на это - если table2.id встречается только один раз в таблице1.id, не возвращайте его.SQL Query to Bring Back, где Row Count больше 1

Я думал, что это будет некоторая комбинация группового предложения и порядка, который может сделать это, но не получить правильные результаты. Как бы вы выразили это в SQL-запросе?

 
Table1 
|  id | info  | state |  date | 
|  1 |  123 | TX | 12-DEC-09 | 
|  1 |  123 | NM | 12-DEC-09 | 
|  2 |  789 | NY | 14-DEC-09 | 

Table2 
|  id |  info | state | date  | 
|  1 |  789 | TX | 14-DEC-09 | 
|  2 |  789 | NY | 14-DEC-09 | 
Output 
|table2.id| table2.info | table2.state| table2.date|table1.id|table1.info|table1.state|table1.date| 
|  1 |  789 | TX | 14-DEC-09 |  1 |  123 | TX | 12-DEC-09 | 
|  1 |  789 | TX | 14-DEC-09 ||  1 |  123 | NM | 12-DEC-09 | 
+0

Можете ли вы сказать нам, что вы пробовали? Это всегда хорошая идея, чтобы освежить основы вашей области. Проверьте некоторые из этих ресурсов на SQL: [w3schools] (http://www.w3schools.com/sql/); [khan academy] (https://www.khanacademy.org/computing/computer-programming/sql). В качестве намека вы, вероятно, захотите изучить внешние ключи и присоединиться. – franklin

ответ

2

Если вы используете MSSQL попытаться использовать общее табличное выражение

WITH cte AS (SELECT T1.ID, COUNT(*) as Num FROM Table1 T1 
      INNER JOIN Table2 T2 ON T1.ID = T2.ID 
      GROUP BY T1.ID 
      HAVING COUNT(*) > 1) 
SELECT * FROM cte 
INNER JOIN Table1 T1 ON cte.ID = T1.ID 
INNER JOIN Table2 T2 ON cte.ID = T2.ID 
+0

Спасибо, что ваше предложение отлично работало с временной таблицей. – rustyocean

+0

Нет проблем. Рад помочь –

0

Прежде всего, я хотел бы предложить добавить автоинкрементный столбец таблицы, чтобы сделать запросы, как это гораздо проще писать (вы все еще сохраните свой идентификатор, как сейчас, для реляционного сопоставления). Например:

Таблица 1:

TableID int 
ID int 
Info int 
State varchar 
Date date 

Таблица 2:

TableID int 
ID int 
Info int 
State varchar 
Date date 

Тогда ваш запрос будет очень легко, не нужно группе, использовать КТР или row_over секционирования:

SELECT * 
FROM Table2 T2 
JOIN Table1 T1 
    ON T2.ID = T1.ID 
JOIN Table1 T1Duplicate 
    ON T2.ID = ID 
    AND T1.TableID <> T1Duplicate.TableID 

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

+0

Хмм интересно .... но идентификаторы должны были бы соответствовать правильно? – rustyocean

0

Я считаю это гораздо более простой способ сделать это:

select  TableA.*,TableB.* 
from  TableA 
inner join TableB 
     on TableA.id=TableB.id 
where  TableA.id in 
      (select distinct id 
      from  TableA 
      group by id 
      having count(*) > 1)