2015-06-02 47 views
1

我有這樣的查詢:SQL WHERE子查詢的字段列表

SELECT field 
FROM table 
WHERE 
    (
     SELECT COUNT(*) 
     FROM table2 
     WHERE table2.field = table.field 
    ) 
    != 
    (
     SELECT COUNT(*) 
     FROM table3 
     WHERE table3.field = table.field 
    ) 

現在我想有這些WHERE子查詢像我的字段列表:

SELECT field, count1, count2 
FROM table 
WHERE 
    (
     SELECT COUNT(*) 
     FROM table2 
     WHERE table2.field = table.field 
    ) AS Count1 
    != 
    (
     SELECT COUNT(*) 
     FROM table3 
     WHERE table3.field = table.field 
    ) AS Count2 

這可能嗎?當然,我可以把這些子查詢放在字段列表中,但是我無法比較它們。

任何想法?

回答

2

如果使用Sql Server你可以這樣做:

SELECT field, ca2.c2, ca3.c3 
FROM table t 
cross apply(SELECT COUNT(*) c2 
      FROM table2 t2 
      WHERE t2.field = t.field)ca2 
cross apply(SELECT COUNT(*) c3 
      FROM table3 t3 
      WHERE t3.field = t.field)ca3 
where ca2.c2 <> ca1.c1 
+0

謝謝!這工作完美 – Koruba

0

使用相關子查詢計數。在派生表結束語:

select dt.* from 
(
SELECT field, 
     (SELECT COUNT(*) 
     FROM table2 
     WHERE table2.field = table.field) as cnt1, 
     (SELECT COUNT(*) 
     FROM table3 
     WHERE table3.field = table.field) as cnt2 
FROM table 
) dt 
where dt.cnt1 <> dt.cnt2 
+0

我會建議完全相同的事情,但我認爲giorgi的答案可能會有更好的表現。 –

+2

取決於使用的DBMS? (沒有dbms指定...) – jarlh

+0

正確...我錯過了... –

0

你只需要使用一個派生表:

select * 
from 
(
    SELECT field, 
    (
     SELECT COUNT(*) 
     FROM table2 
     WHERE table2.field = table.field 
    ) AS Count1, 
    (
     SELECT COUNT(*) 
     FROM table3 
     WHERE table3.field = table.field 
    ) AS Count2 
    FROM table 
) dt 
WHERE Count1 <> Count2 
+0

你錯過了一個逗號之後AS Count1 – jarlh

+0

@jarlh:剪切和粘貼:-) – dnoeth