簡體   English   中英

SQL查詢1:N參考

[英]SQL query 1:N references

我在看什么

我想知道是否可以創建一個SELECT來在一行中顯示來自2個表的以下信息:

偽代碼

SELECT
    Data_Car,
    Car_Holders_Data 
FROM Car, Holder_Data 
WHERE
    Car.License_PLate_PK = Holder_Data.License_Plate.FK

我的桌子

CAR(License_Plate_PK, Frame, Car_Info)
Holder_Data(License_Plate_FK, Holder_Data)

我的結果

License_Plate |        Frame        |     Car_Info's     | Holder_Name
   AA001AA       VF7UA9HR8CJ615652        Car Things       Mario Rossi
   AA001AA       VF7UA9HR8CJ615652      Same Car Things    Luigi Verdi

我想實現的目標

License_Plate |       Frame        |     Car_Info's     | Holder_Name1   | Holder Name2
   AA001         VF7UA9HR8CJ615652       Car Things       Mario Rossi      Luigi Verdi

(我之所以寫汽車用品,只是因為我有30列有關汽車信息的欄目。為了簡化起見,您可以輕松地忽略該欄)

我知道如果有2個或更多Holder,我的查詢將返回2個或更多行。 有沒有一種方法可以將所有持有人歸還同一行?

我正在使用MS SQL Management Studio 2008

SQL不允許不確定或動態更改的列數。 這意味着您需要預先確定要擁有多少個holder列。

例如,以下代碼將透視您的holder_data(然后可以將其連接到您的car表) 它假定最多三個持有人。

SELECT
  license_plate,
  MAX(CASE WHEN row_id = 1 THEN name    END)   AS holder_1_name,
  MAX(CASE WHEN row_id = 1 THEN address END)   AS holder_1_address,
  MAX(CASE WHEN row_id = 2 THEN name    END)   AS holder_2_name,
  MAX(CASE WHEN row_id = 2 THEN address END)   AS holder_2_address,
  MAX(CASE WHEN row_id = 3 THEN name    END)   AS holder_3_name,
  MAX(CASE WHEN row_id = 3 THEN address END)   AS holder_3_address
FROM
(
  SELECT
    *,
    ROW_NUMBER() OVER (PARTITION BY license_plate ORDER BY some_date_field)  AS row_id
  FROM
    holder_data
)
  AS sorted_holder_data

如果您希望根據持有人的數量動態更改,則需要分幾個步驟進行。
1.運行查詢以找出最大持有人數
2.運行一些編寫SQL的代碼以多次重復MAX(CASE)
3.使用sp_executesql運行由代碼編寫的sql

那是很多費力的工作,對吧? 必須有一種更好的SQL本機支持方式嗎?

你是對的。 從頭開始設計SQL,以通過使用規范化數據來實現其關系性質。 也就是說,從編程角度而不是從人類友好的表示角度考慮數據的結構。

方便地,您已經具有標准化結構中的數據。 因此,如果您想要真正的SQL處理方式, 請不要旋轉數據。

但是,介紹呢?

那不是SQL的目的。 SQL是一種數據存儲和處理語言。 它不是設計或打算用於演示。 您應該將設計的表示層與數據層分開 混合使用這兩種方法會導致各種維護問題。 這是一種錯誤的經濟做法,因為您嘗試堅持這種非規范化的思維方式的時間越長,使用SQL的難度越大。 不要這樣做,讓您的SQL數據結構規范化,這就是SQL的目的。

取而代之的是,這種旋轉應在您的表示層中完成。 是Excel或SSRS還是QlikView或Tableau等等。 他們也了解規范化數據,並積極准備將規范化數據轉換為人類可呈現的格式。

編輯:

我剛剛讀到您在評論中寫道:

我對excel的管理不是很好,所以我在尋找是否有一種方法可以在導出后而不是在編輯xlsx表的過程中或之前進行。

那里有你的問題。 因為您對Excel不確定,所以您想使用SQL來為您做。 不幸的是,SQL是錯誤的地方,而Excel是正確的地方。 您需要學習如何在Excel中進行操作。

查看數據透視表,Power Pivot,VBA (適用於Visual Basic的應用程序)等。Excel有許多方法可以完成所需的工作,我強烈建議您學習如何使用正確的工具來完成工作,而不是笨拙做對您不利的錯誤工具。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM