2015-10-29 27 views
0

我想要好的SQL查詢,但需要對一些幫助......查詢的數據(通過外鍵連接)

表A

1 "aaa" "STATUS_OK" 
2 "bbb" "STATUS_OK" 
3 "ccc" "STATUS_OK" 
4 "ddd" "STATUS_NOT_OK" 

表B

1 "Addtional Data1" 1/9/2015 2 (foregin Key = TableA.ID) 
2 "Addtional Data2" 2/9/2015 2 (foregin Key = TableA.ID) 
3 "Addtional Data3" 3/9/2015 2 (foregin Key = TableA.ID) 
4 "Addtional Data4" 4/9/2015 2 (foregin Key = TableA.ID) 

所以表A的2個「bbb」實體在表B中有4個附加數據

這裏我想從表A中提取行

  1. 狀態爲"STATUS_OK"
  2. 沒有在過去2周

我認爲這一天左右的額外數據。我熟悉基本的SQL語法,但這給我很難。

任何人都可以幫我做這個查詢嗎?

我可以通過添加表A「更新時間」解決這個問題,但這種解決方案是不是最好...


如果我在做簡單的SQL這種情況下,

CREATE TABLE table_A(
    ID   int NOT NULL, 
    NAME   VARCHAR(20), 
    STATUS  VARCHAR(20), 
    PRIMARY KEY(ID) 
); 

CREATE TABLE table_B(
    ID   int NOT NULL, 
    DATA   VARCHAR(20), 
    CREATEDATE DATE, 
    A_ID   int, 
    PRIMARY KEY(ID), 
    FOREIGN KEY (A_ID) REFERENCES table_A(ID) 
); 
+1

MySQL或MS SQL Server?不要標記不涉及的產品... – jarlh

回答

0

一種方式是通過NOT EXISTS做到這一點:

SELECT ID,NAME,[STATUS] 
FROM table_A a 
WHERE a.[STATUS] = 'STATUS_OK' 
     AND NOT EXISTS 
      (SELECT TOP 1 1 
      FROM table_B b 
      WHERE b.A_ID = a.ID 
        AND DATEDIFF(WEEK,b.CREATEDATE,GETDATE())<=2) 

編輯:這是另一個版本使用LEFT JOIN

SELECT a.ID, a.NAME, a.[STATUS] 
FROM table_A a 
     LEFT JOIN table_B b ON a.ID = b.A_ID 
           AND DATEDIFF(WEEK,b.CREATEDATE,GETDATE())<=2 
WHERE a.[STATUS] = 'STATUS_OK' 
     AND b.A_ID IS NULL 

編輯2:使用子查詢也可以。在小桌子上,這3個查詢中沒有任何差異。如果你對數百萬條記錄運行它,你必須檢查哪一個最適合你:

SELECT ID,NAME,[STATUS] 
FROM table_A a 
WHERE a.[STATUS] = 'STATUS_OK' 
     AND a.ID NOT IN 
      (SELECT b.A_ID 
      FROM table_B b 
      WHERE DATEDIFF(WEEK,b.CREATEDATE,GETDATE())<=2) 
+0

在NOT EXISTS子查詢中的TOP是否有區別?任何行都存在或不存在。 – jarlh

+0

如果有區別,它可能很小。我只是做'SELECT TOP 1',因爲在我看到的更大的查詢中,這只是檢查這個表中是否存在任何東西。我討厭使用'*'...也許有個人喜好 – CeOnSql

+0

我只是做了select 1. – jarlh