2010-11-14 33 views
2

我有以下表格:倒SQL查詢

表1 {ArticleNo(INT),ArtDescription(串)}

表2 {ArticleNo(INT),年份(日期)}

Table1.ArticleNo是主鍵。 Table2.ArticleNo是一個外鍵參考table1.ArticleNo

這是很難解釋我想查詢什麼,所以這裏一個簡單的例子:


表1

(1,Desk) 
(2,Chair) 
(3,Ruler) 

表2

(1,2000) 
(1,2000) 
(2,2001) 

查詢應返回:

1 Desk 2001 
2 Chair 2000 
3 Ruler 2000 
3 Ruler 2001 

未在所有年份出售(或其他)(表2,從各年)的所有文章。


我希望你能理解我的例子 - 查詢似乎很複雜。在這裏我的解決方案:

SELECT table1.ArticleNo,table1.ArtDescription,table2.Year 
FROM table1 
JOIN table2 
ON table1.ArticleNo=table2.ArticleNo 
WHERE NOT table1.ArticleNo IN (SELECT table2.Year FROM table2); 

我嘗試了很多不同的事情..我希望你能幫助我!

+1

我想你可能要重新考慮你的表模式。這將非常迅速地變得非常複雜,並沒有提供任何直接的好處。也許你的第二張桌子應該是商品出售的年份,而不是出售。 – 2010-11-14 13:40:26

+0

在你的例子中,「WHERE NOT table1.ArticleNo IN(SELECT table2.Year FROM table2)」;你在比較ArticleNo到一年。從你永遠不會匹配的數據示例。 – 2010-11-14 13:59:12

+0

您正在使用哪個數據庫引擎? – Quassnoi 2010-11-14 17:02:23

回答

2
SELECT t1.*, t2.year 
FROM t1 
CROSS JOIN 
     (
     SELECT DISTINCT year 
     FROM t2 
     ) t2 
WHERE (t1.id, t2.year) NOT IN 
     (
     SELECT t2.id, t2.year 
     FROM t2 
     ) 

創建索引t2 (year, id)(按此順序)以便查詢快速運行。

+0

感謝您的幫助!抱歉格式不好 - 現在我知道如何做得更好。 – 2010-11-14 13:43:08

0

有很多方法可以做到這一點。舉兩個例子:

select 
    t1.ArtDescription, 
    y.Year 
from 
    Table1 t1 
    join (
    select distinct 
     t2.Year 
    from 
     Table2 t2 
) y on 1=1 
where 
    not exists (
    select 
     1 
    from 
     Table2 tx2 
    where 
     tx2.ArticleNo = t1.ArticleNo and tx2.Year = y.Year) 

甲骨文(SQL Server可以做同樣的事情,使用EXCEPT代替MINUS):

select 
    t1.ArtDescription, 
    y.Year 
from 
    Table1 t1 
    join (
    select distinct 
     t2.Year 
    from 
     Table2 t2 
) y on 1=1 
MINUS 
select 
    t12.ArtDescription 
    t22.Year 
from 
    Table1 t12 
    join Table2 t22 on t12.ArticleNo = t22.ArticleNo 
+0

不錯的一個,我認爲你可以更清楚地寫下它,通過替換「加入...」在1 = 1'「上有一個」交叉連接「 – Andomar 2010-11-14 13:45:02

+0

啊..第一個看起來不那麼複雜,謝謝! – 2010-11-14 13:45:15

1

你可以使用一個cross join創建所有項目+一年組合的列表。然後,你可以用not exists條件過濾,而不銷售信息的行:

select * 
from t1 items1 
cross join  
     (
     select distinct year 
     from t2 sales1 
     ) sales2 
where not exists 
     (
     select * 
     from t2 sales3 
     where sales3.ItemId = items1.ItemId 
       and sales3.Year = sales2.Year 
     ) 
0
SELECT DISTINCT table1.ArticleNo,table1.ArtDescription,table2.Year 
    FROM table1 CROSS JOIN table2 
    WHERE table1.ArticleNo != table2.ArticleNo order by table1.ArticleNo;