我有两张桌子。他们有相同的数据,但来自不同的来源。我想找到两个表中的所有列,其中表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 |
答案 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()