SELECT * INTO NewTable FROM OldTable WHERE 1 <> 1;
-- 或
SELECT TOP 0 * INTO NewTable FROM OldTable;
WHERE 1<>1 條件永假,僅複製結構;TOP 0 同理。適用 SQL Server / Access。
INSERT INTO TargetTable (ColA, ColB, ColC)
SELECT ColD, ColE, ColF FROM SourceTable;
明確列出欄位清單,避免結構變更導致錯誤。
SELECT a.Title, a.UserName, b.LastReply
FROM ForumTable a
JOIN (
SELECT Title, MAX(AddDate) AS LastReply
FROM ForumTable
GROUP BY Title
) b ON a.Title = b.Title;
衍生表先聚合每主題最新回覆,再聯接主表取得發文者。
SELECT a.ColA, a.ColB, a.ColC, b.ColC, b.ColD, b.ColF
FROM TableA a
LEFT OUTER JOIN TableB b ON a.ColA = b.ColC;
保留左表所有列,右表無對應為 NULL。
SELECT * FROM Schedule
WHERE DATEDIFF(minute, StartTime, GETDATE()) > 5;
DATEDIFF 計算分鐘差,大於 5 表示已進入提醒窗口。注意:DATEDIFF 僅比較邊界,精確提醒需加上秒級判斷。
DELETE FROM MainTable
WHERE NOT EXISTS (SELECT 1 FROM DetailTable WHERE MainTable.ID = DetailTable.MainID);
NOT EXISTS 配合 SELECT 1 效能優於 NOT IN (尤其含 NULL 時)。
SELECT A.NUM, A.NAME, B.UPD_DATE, B.PREV_UPD_DATE
FROM Table1 A
JOIN (
SELECT X.NUM, X.UPD_DATE, Y.UPD_DATE AS PREV_UPD_DATE
FROM (
SELECT NUM, UPD_DATE, INBOUND_QTY, STOCK_ONHAND
FROM Table2
WHERE TO_CHAR(UPD_DATE, 'YYYY/MM') = TO_CHAR(SYSDATE, 'YYYY/MM')
) X
LEFT JOIN (
SELECT NUM, UPD_DATE, STOCK_ONHAND
FROM Table2
WHERE TO_CHAR(UPD_DATE, 'YYYY/MM') = TO_CHAR(TO_DATE(TO_CHAR(SYSDATE, 'YYYY/MM') || '/01', 'YYYY/MM/DD') - 1, 'YYYY/MM')
) Y ON X.NUM = Y.NUM
WHERE X.INBOUND_QTY + NVL(Y.STOCK_ONHAND, 0) <> X.STOCK_ONHAND
) B ON A.NUM = B.NUM;
Oracle 語法範例:比對本月與上月庫存快照,找出進貨量 + 上月結存 ≠ 本月結存的異常單據。展示:動態月份計算、左外聯接保留無上月資料項目、NVL 處理 NULL、條件過濾異常。
七個技巧涵蓋 DDL/DML 基礎操作、外聯接應用、日期運算、資料清理、複雜業務同步邏輯。建議收藏並根據實際資料庫平台 (SQL Server/Oracle/PostgreSQL) 語法微調後套用。