2012-06-22 72 views
0

我有兩個表,我想將它們連接在一起。SQL命令可以在同一命令行中使用,但可以在兩個不同的表上使用

表1

Year, ID, Theme, 

表2

First, Last, WeekID, Date, Affiliation 

我想用這個命令

SELECT * 
FROM Table1 
CROSS JOIN Table2 
WHERE Table1.ID = 5 
    AND WHERE Table2.Date >= 1/1/2011 
    AND Table2.Date <= 12/30/2011 
ORDER BY Asc 

我想做的發生是所有的行和列從表1是選擇ID列包含int值爲5的位置。在Table2中,應該選擇所有列和行都在給定日期範圍內。

我想知道WHERE子句是否應該在CROSS JOIN子句之後,如上所述。另外,我應該刪除第二個WHERE關鍵字,而不是有以下命令。

SELECT * 
FROM Table1 
CROSS JOIN Table2 
WHERE Table1.ID = 5 
    AND Table2.Date >= 1/1/2011 
    AND Table2.Date <= 12/30/2011 
ORDER BY Asc 

我的第三個問題是很棘手的。可以將2個不同的WHERE子句用於像這樣的單個命令,但是可以應用於單獨的表?當我加入表格時,我可以有WHERE Table1 (*Condition*) AND WHERE Table2 (*Condition*)嗎?

我想我可以通過爲每個表創建2個單獨的SQL命令1並避免使用JOIN2 WHERE子句來輕鬆解決整個問題。這是你會推薦的嗎?

最終的結果會是這個樣子

表3

ID, Year, Theme, WeekID, Date, First, Last, Affiliation 

隨後的細胞是爲了在根據日期按升序排列。

一個示例表低於

表3

ID  Year  Theme  WeekID  Date   First  Last Affiliation 
5  2011  Stuff1 1   01/09/2011 Foo  Bar  Baz Inc 
5  2011  Stuff2 2   01/14/2011 Flum  Baz  Bar Inc 
5  2011  Stuff3 3   04/15/2011 Bar  Flum Bub Inc 
5  2011  Stuff4 4   05/01/2011 Bar  Foo  FlumBub Inc 
5  2011  Stuff5 5   08/16/2011 Bub  Baz  Foo Inc 
+1

如何在這些2個表有關?沒有加入條件... – Randy

+2

@Randy:我想這就是爲什麼Derek正在使用CROSS JOIN。 –

+0

CROSS JOIN子句應該與它們相關 – TheDude

回答

1

問:我想知道WHERE子句是否應該在CROSS JOIN子句之後,如上所述。

A:是的,這是WHERE條款的正確位置。

問:也應該刪除第二個WHERE關鍵字,而不是有以下命令。

A:是的,WHERE子句只能在簡單的SELECT語句中出現一次。每個子查詢可以有它自己的WHERE子句,但這實際上仍然是每個SELECT一個WHERE子句。

問:我的第三個問題是棘手的問題。在這樣的單個命令中是否可以使用2個不同的WHERE子句,但是可以應用於單獨的表?意思我可以在哪裏表1(條件)和哪裏表2(條件)當我加入表?

A:WHERE關鍵字只能出現一次,每SELECT。你可以在任何表格中包含謂詞。


另外,回答你也沒問一些額外的問題...

您需要提供一個表達式,或者表達式的列表中,ORDER BY子句。默認順序是ASC,所以此關鍵字最常被忽略。

Table2的Date列上的謂詞看起來代表日期文字。 (因爲它們在你的語句中,它們看起來代表一個整數值,由一系列除法運算得出)

文字應該明確地轉換爲DATETIME(以匹配Date列的數據類型)顯式CONVERT不是SQL Server所需要的,但是如果沒有轉換,你真的希望那些被表示爲規範的(明確的)格式的字符串。('3/5/2012'代表3月5日還是5月3日?)

SQL Server DATTIME數據類型存儲日期和時間組件,通常,當用戶要求結束日期時,它們也意味着當天的任何時間。 :30:00'不是< ='2011-12-30',我們通常會編寫一個LESS THAN中期測試第二天晚上。

這是非常好的做法來限定對列的引用。這通常使用表別名來完成。表別名不是必需的,但它們是一個熟悉的模式,並且可以使閱讀語句更容易。當表名完全限定爲mydatabase.schema.MyLongAndUnWeILDyTblName時尤其如此,並且在更復雜的表達式中使用的完全限定列名可以使表達式解密非常乏味。 (在你的情況下,這不是一個真正的問題,但它是我們遵循的模式,即使是簡單的陳述。)

此外,最佳做法是避免在SELECT列表中使用*(除非您從內聯視圖或CTE在聲明中)。而是列出您想要返回的特定表達式。對於測試和開發,使用*很好。除了那些小問題,你的陳述看起來很好。 (避免*和限定列名避免未來可能發生的問題,例如,當一個新列被添加到一個表中時,會引起一個前面沒有的「模糊列」異常。 (我們希望能夠增加一列沒有應用程序運行的每一個SQL語句的完整迴歸測試。)

鑑於所有這些信息,你沒有問...在我們的商店,該語句來回報您指定結果集將被格式化是這樣的:

SELECT t1.ID 
    , t1.Year 
    , t1.Theme 
    , t2.WeekID 
    , t2.Date 
    , t2.First 
    , t2.Last 
    , t2.Affiliation 
    FROM dbo.Table1 t1 
CROSS 
    JOIN dbo.Table2 t2 
WHERE t1.ID = 5 
    AND t2.Date >= CONVERT(DATETIME,'2011-01-01',20) 
    AND t2.Date < CONVERT(DATETIME,'2011-12-31',20) 
ORDER 
    BY t1.ID 
    , t1.Year 
    , t1.Theme 
    , t2.WeekID 
    , t2.Date 
    , t2.First 
    , t2.Last 
    , t2.Affiliation 

在後面的評論中,Derek指出Date列是VARCHAR。在這種情況下,不幸的,我們需要知道的日期在。

呈現的格式。如果字符串表示不在一個規範格式的VARCHAR比較會產生不良的結果。

(注意該字符串「2011年3月5日」之間沒有「2011/1/1」 AND '12/30/2011' )。

有顯著的優勢使用DATETIME數據類型存儲日期值。如果這是不可能的(無論何種原因陰險有人來了),和字符串不是一個規範的格式,則謂詞確實應該更多的東西一樣:

AND CONVERT(DATETIME,t2.Date,101) >= CONVERT(DATETIME,'01/01/2011',101) 
AND CONVERT(DATETIME,t2.Date,101) < CONVERT(DATETIME,'12/31/2011',101) 
+0

我已請求更新SQL數據庫,以便日期列不再是varchar,而不是類型日期。這完全只是測試和試驗單個SQL命令代碼可以做什麼。我們遇到了一個實例,在這個實例中,我們遇到了一個說SQL命令很長的錯誤。我可以;不記得它給我們的確切的#,但由於某種原因,我的頭上有128根棍子。 – TheDude

+0

@ Derek- SQL Server語句的最大大小SQLText非常大。在64位系統上,我相信它在2GB左右。在打擊查詢文本的SQL Server最大大小之前,您將遇到其他限制。 – spencer7593

0

我想你最好是去使用CTE這樣的:

WITH Table1CTE (COL1, COL2) 
AS 
(
SELECT COL1, COL2 
FROM Table1 
WHERE Table1.ID = 5 
), 
Table2CTE (COL3, COL4) 
AS 
(
SELECT COL3, COL4 
FROM TABLE2 
WHERE Table2.Date >= 1/1/2011 
    AND Table2.Date <= 12/30/2011 
) 
SELECT * 
FROM Table1CTE CROSS JOIN Table2CTE 
ORDER BY COL1 ASC 
+0

你能不能給我一個簡要的解釋,究竟這是應該做? – TheDude

+0

剛剛注意到您對日期的評論 - 您可能需要爲該部分執行Cast(Table2.Date as DateTime)> = 2011/1/1。 – CompuChip

+0

就CTE所做的而言,CTE中的每個查詢都只返回該表所需的記錄。如果您在每個CTE上執行交叉連接,它應該爲您提供交叉連接所需的記錄。對於CTE的一個很好的資源,請查看http://www.4guysfromrolla.com/webtech/071906-1.shtml – CompuChip

0

第一SELECT命令

SELECT * 
FROM Table1 
CROSS JOIN Table2 
WHERE Table1.ID = 5 
    AND WHERE Table2.Date >= 1/1/2011 
    AND Table2.Date <= 12/30/2011 
ORDER BY Asc 

將產生近WHERE關鍵字

只有一個WHERE語句需要使用可以通過AND指定的任何其他條件的

不正確的語法錯誤。

而且上述需要指定的日期被格式化爲例如

Table2.Date >= '01/01/2011' AND Table2.Date <= '12/30/2011' 

否則SQL命令將執行整數運算和類型轉換爲int,而不是匹配日期字符串,其在表中的日期類型varchar

+1

,爲什麼你的日期列varchar? –

+0

因爲我沒有設置我剛剛使用它們的SQL表。我已要求將其更改爲鍵入日期。無論哪種方式日期ot varchar要求日期邊界被撇號圍起來 – TheDude

+0

在初始'WHERE'之後,通過簡單的'AND'而不是'AND WHERE ....'來添加附加條件。在有效的SQL語句中不能有多個WHERE –

相關問題