SQL查询返回行计数大于1的位置

时间:2016-02-12 16:17:35

标签: sql sql-server group-by

我有两张桌子。他们有相同的数据,但来自不同的来源。我想找到两个表中的所有列,其中表2中的id在表1中出现不止一次。另一种看待它的方法是,如果table2.id在table1.id中只出现一次,则不要将它带回来。

我一直认为这将是group by和order by子句的某种组合,可以完成这项工作,但它没有得到正确的结果。你会如何在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 |

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

首先,我建议在表格中添加一个自动递增列,以使这样的查询更容易编写(您仍然可以保留您的ID,因为现在您可以使用关系映射)。例如:

表1:

TableID int
ID int
Info int
State varchar
Date date

表2:

TableID int
ID int
Info int
State varchar
Date date

然后您的查询将非常简单,无需分组,使用CTE或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

阅读起来容易得多。此外,在很多场景中,自动递增ID字段都是有益的。

答案 2 :(得分:0)

I find this a much simpler way to do it:

f.close()