2009-10-29 76 views
2

我一直在使用SQL多年,但主要是使用SQL Studio(等)中的查詢設計器來組合我的查詢。我最近找到了一些時間來真正「學習」一切正在做的事情,併爲自己設定了以下相當簡單的任務。在開始之前,我想問SOF社羣他們對問題,可能的答案和他們可能有的任何提示的想法。一些SQL問題

問題是;

  1. 找到所有記錄瓦特/特定列重複(如鏈接ID是在整個表超過1個記錄)從一個鏈接表
  2. SUM價格在同一查詢中(內選擇選擇? )
  3. 解釋4個連接的區別; LEFT,RIGHT,OUTER,INNER從一個表
  4. 將數據複製到另一基於SELECT和WHERE標準

輸入歡迎&理解。

克里斯

+3

這味道像hw。 –

回答

1

我建議您從關注此主題的一些教程開始。對於在SQL中從初級到中級移動的人而言,您的問題並不罕見。 SQLZoo是學習SQL的絕佳資源,因此請考慮以下事項。

在回答你的問題:

1)找到一個重複的所有記錄在一個特定的列

有兩個步驟在這裏:找到重複的記錄,並選擇那些記錄。要了解你應該沿着線做一些重複的記錄:

select possible_duplicate_field, count(*) 
from table 
group by possible_duplicate_field 
having count(*) > 1 

我們在這裏所做的一切選擇從一個表,然後我們想檢查重複字段分組它。計數函數然後給我一個該組內項目數的計數。 HAVING子句表示我們想要在分組之後進行過濾,以僅顯示具有多個條目的組。

這本身就很好,但它並沒有給你帶有這些值的實際記錄。如果您知道重複的值,那麼你會這樣寫:

select * from table where possible_duplicate_field = 'known_duplicate_value' 

我們可以使用內選擇選擇來獲得比賽的名單:從鏈接

select * 
from table 
where possible_duplicate_field in (
    select possible_duplicate_field 
    from table 
    group by possible_duplicate_field 
    having count(*) > 1 
) 

2)SUM價格在同一查詢內表

這是一個簡單的兩個表之間與這兩者的SUM JOIN:

select sum(tableA.X + tableB.Y) 
from tableA 
join tableB on tableA.keyA = tableB.keyB 

您在這裏做的是將兩個表連接在一起,其中這兩個表由關鍵字段鏈接。在這種情況下,這是一個自然的連接,它可以像你期望的那樣工作(也就是讓我從左邊的表中得到一切,它在右邊表中有一個匹配的記錄)。

3)解釋4個連接的區別;左,右,外,內

考慮兩個表A和B.在這種情況下,「左」和「右」的概念稍微清晰一點,如果您從左到右閱讀您的SQL。所以,當我說:

select x from A join B ... 

左表是「A」,右表是「B」。現在,當您明確聲明「LEFT」SQL語句時,您聲明您要加入的兩個表中的哪一個是主表。我的意思是:我首先掃描哪張表?順便說一下,如果你省略了LEFT或RIGHT,那麼SQL隱式地使用了LEFT。

對於INNER和OUTER,您聲明在其中一個表中不存在匹配項時要執行的操作。 INNER聲明您希望主表中的所有內容(如使用LEFT或RIGHT聲明的)在輔助表中存在匹配的記錄。因此,如果主表包含鍵「X」,「Y」和「Z」,並且輔助表包含鍵「X」和「Z」,那麼INNER將只返回「X」和「Z」記錄兩張桌子。

當使用OUTER時,我們說:給我一切從主表和任何匹配次表。因此,在前面的例子中,我們會在輸出記錄集中獲得「X」,「Y」和「Z」記錄。但是,應該來自輔助表的鍵值爲「Y」的字段中將存在NULL,因爲它不存在於輔助表中。

4)從一臺基於SELECT和WHERE條件

這是相當瑣碎,我很驚訝你從來沒有遇到過的數據複製到另一個。這是在INSERT語句中一個簡單的嵌套SELECT(這可能不是由你的數據庫的支持 - 如果沒有,請嘗試下一個選項):

insert into new_table select * from old_table where x = y 

這是假設表具有相同的結構。如果你有不同的結構,那麼你需要指定列:

insert into new_table (list, of, fields) 
    select list, of, fields from old_table where x = y 
+0

夢幻般的史蒂夫。寫得很好,例子清楚地解釋了事情。你應該寫一本書! ;) – dooburt

1

比方說,你有2個表命名爲:

  • [訂單行]與列[ID,的OrderId,產品編號,數量,狀態]
  • [產品]與[ID,名稱,價格]

1)具有超過1行命令的所有訂單項目(它在技術上一樣找上的OrderId重複:):

之間
select OrderId, count(*) 
from OrderLine 
group by OrderId 
having count(*) > 1 

2)總價格了訂單的所有順序線1000

select sum(p.Price * ol.Qty) as Price 
from OrderLine ol 
inner join Product p on ol.ProductId = p.Id 
where ol.OrderId = 1000 

3)差聯接:

  • 一個內連接B =>採取一切一個具有匹配與b。如果未找到b,則a將不會被退回
  • a左連接b =>全部a,與b匹配,即使未找到b也包含a
  • a righ join b => b left join一個
  • 一個外部聯接b =>(左連接b)工會(右連接b)

4)複製命令行歷史記錄表:

insert into OrderLinesHistory 
(CopiedOn, OrderLineId, OrderId, ProductId, Qty) 
select 
    getDate(), Id, OrderId, ProductId, Qty 
from 
    OrderLine 
where 
    status = 'Closed' 
+0

對1的回答不正確--OP要求重複計數 – RichardOD

+0

謝謝manitra!這個問題似乎引起了各種爭議,所以我會接受你的答案。謝謝。 :) +1 – dooburt

+0

我糾正了#1(w /和w/o混淆:) –

-1

要回答#4並可能顯示至少一些SQL的理解和事實這不是硬件,只是我噸渴望學習最佳實踐;

SET NOCOUNT ON; 
DECLARE @rc int 
if @what = 1 
    BEGIN 
     select id from color_mapper where product = @productid and color = @colorid; 
     select @rc = @@rowcount 
     if @rc = 0 
     BEGIN 
      exec doSavingSPROC @colorid, @productid; 
     END 
    END 
END 
+0

-1不好的例子,沒有回答#4,與問題沒有真正相關性(並沒有顯示對SQL的理解,因爲你更可能從其他人編寫的SP複製它) – finnw

+0

其實我寫了SQL。如Steve N所示,這不是最好的方式,但問題的目的是爲了展示我對SQL的理解 - 許多人認爲這些問題都是針對HW的。 – dooburt

+0

此外,你的態度很差。你是否只是無意訪問而回答問題,但要記下答案? – dooburt