2016-02-12 73 views
1

我有兩個表格。它們具有相同的數據,但來自不同的來源。我想從兩個表中找出表2中id在表1中多次出現的所有列。另一種查看方法是,如果table2.id在table1.id中只出現一次,則不要將其返回。用於返回行數大於1的SQL查詢

我一直認爲它會是一組按組合和按順序排列的子句,可以完成此操作,但不會得到正確的結果。你如何在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

首先,我還是會建議增加一個自動遞增列到表中進行查詢這樣更容易編寫(你保持你的ID,因爲你現在有關係映射)。例如:

表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 

閱讀起來很容易。此外,有很多情況下自動遞增ID字段是有益的。

+0

嗯有趣....但ID必須匹配嗎? – 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)