Chọn nhiều giá trị trong Toán tử THÍCH


10

Tôi có một truy vấn SQL được đưa ra dưới đây, tôi muốn chọn nhiều giá trị bằng cách sử dụng liketoán tử.

Truy vấn của tôi có đúng không?

SELECT top 1 employee_id, employee_ident, utc_dt, rx_dt 
FROM       employee
INNER JOIN employee_mdata_history 
ON         employee.ident=employee_mdata_history.employee_ident 
WHERE      employee_id like 'emp1%' , 'emp3%' 
ORDER BY   rx_dt desc

Nếu không, có ai có thể sửa tôi không?

Bảng của tôi có số lượng lớn dữ liệu bắt đầu bằng 'emp1''emp3'. Tôi có thể lọc kết quả theo top 3 "emp1" và top 2 "emp3" dựa trên rx_dtkhông?

Câu trả lời:


16

Ngoài ra, bạn có thể thử phương pháp sau:

SELECT
  x.*
FROM
  (
    VALUES
      ('emp1%', 3),
      ('emp3%', 2)
  ) AS v (pattern, row_count)
  CROSS APPLY
  (  -- your query
    SELECT top (v.row_count)
               employee_id, employee_ident, utc_dt, rx_dt 
    FROM       employee
    INNER JOIN employee_mdata_history
    ON         employee.ident=employee_mdata_history.employee_ident 
    WHERE      employee_id like v.pattern
    ORDER BY   rx_dt desc
  ) AS x
;

Hàm tạo VALUEShàng biểu thị danh sách mẫu của bạn dưới dạng bảng, cung cấp thêm cho mỗi mẫu với số lượng hàng cần truy xuất cho mẫu đó. Toán tử CROSS ỨNG DỤNG áp dụng truy vấn của bạn cho mọi hàng trong danh sách mẫu, tức là cho mọi mẫu, giới hạn số lượng hàng cho mỗi mẫu cho giá trị tương ứng từ danh sách mẫu.

Là một lưu ý phụ, xin vui lòng cho tôi nhân cơ hội này để đề nghị bạn luôn đủ điều kiện các cột của mình với bí danh bảng trong một truy vấn đang đọc từ hai hoặc nhiều bảng. Điều đó làm cho truy vấn của bạn dễ đọc / hiểu hơn. Bạn luôn có thể sử dụng các bí danh ngắn để tránh lặp lại các tên bảng có khả năng dài. Ví dụ:

SELECT TOP (1)
  e.employee_id,
  h.employee_ident,
  ...
FROM
  dbo.employee AS e
  INNER JOIN dbo.employee_mdata_history AS h
    ON e.ident = h.employee_ident
WHERE
  e.employee_id LIKE ...
ORDER BY
  ...

6

Bạn nên sử dụng điều kiện OR / AND:

SELECT TOP (1) 
           employee_id, employee_ident, utc_dt, rx_dt 
FROM       employee
INNER JOIN employee_mdata_history 
ON         employee.ident = employee_mdata_history.employee_ident 
WHERE      employee_id like 'emp1%' 
OR         employee_id like 'emp3%' 
ORDER BY   rx_dt desc;

Hãy xem OR (Transact-SQL) trên MS-Docs.

Tôi đã thiết lập một ví dụ:

create table employees(employee_id varchar(10), employee_name varchar(100));

insert into employees values
('emp10', 'Bryan Nelson'),
('emp12', 'Rosalyn Sanders'),
('emp13', 'Rose Tudler'),
('emp20', 'Julio Gomez'),
('emp30', 'Ian McGregor'),
('emp40', 'Anne Hatt');
GO
SELECT employee_id, employee_name
FROM   employees
WHERE  employee_id LIKE 'emp1%'
OR     employee_id LIKE 'emp3%';
GO
worker_id | Tên nhân viên  
: ---------- | : --------------
emp10 | Bryan Nelson   
emp12 | Sandalyn Sanders
emp13 | Hoa hồng    
emp30 | Ian McGregor   

Hãy nhớ rằng bạn đang sử dụng TOP 1, bạn sẽ nhận được tối đa một hàng, bất kể bạn sử dụng bao nhiêu điều kiện.

SELECT TOP 1 employee_id, employee_name
FROM   employees
WHERE  employee_id LIKE 'emp1%'
OR     employee_id LIKE 'emp3%';
GO
worker_id | Tên nhân viên
: ---------- | : ------------
emp10 | Bryan Nelson

Nếu bạn cần các hàng TOP (X) WHERE employee_id LIKE 'emp1%'cộng với các hàng TOP (X), WHERE employee_id LIKE 'emp3%'bạn có thể sử dụng hai câu lệnh chọn được nối với UNION ALL.

SELECT TOP 3 employee_id, employee_name
FROM   employees
WHERE  employee_id LIKE 'emp1%'
UNION ALL
SELECT TOP 1 employee_id, employee_name
FROM   employees
WHERE  employee_id LIKE 'emp3%'
GO
worker_id | Tên nhân viên  
: ---------- | : --------------
emp10 | Bryan Nelson   
emp12 | Sandalyn Sanders
emp13 | Hoa hồng    
emp30 | Ian McGregor   

Ngoài ra, tôi sẽ thêm tìm kiếm mẫu, nhưng giải pháp này trả về tất cả các bản ghi khớp với mẫu: THÍCH 'emp [13]%'

SELECT employee_id, employee_name
FROM   employees
WHERE  employee_id LIKE 'emp[13]%'
GO
worker_id | Tên nhân viên  
: ---------- | : --------------
emp10 | Bryan Nelson   
emp12 | Sandalyn Sanders
emp13 | Hoa hồng    
emp30 | Ian McGregor   

dbfiddle ở đây


2

Tôi đoán bạn muốn 1 hàng where employee_id like 'emp1%'và một hàng khác where employee_id like 'emp3%'. Một cách để đạt được điều này là sử dụng union:

SELECT t1.*
FROM
  ( SELECT top 1 employee_id, employee_ident, utc_dt, rx_dt 
    FROM       employee
    JOIN employee_mdata_history 
        ON employee.ident=employee_mdata_history.employee_ident 
    WHERE employee_id like 'emp1%'
    ORDER BY rx_dt desc
  ) AS t1
UNION ALL
SELECT t2.*
FROM
  (  SELECT top 1 employee_id, employee_ident, utc_dt, rx_dt 
    FROM       employee
    JOIN employee_mdata_history 
        ON employee.ident=employee_mdata_history.employee_ident 
    WHERE employee_id like 'emp3%'
    ORDER BY rx_dt desc
  ) AS t2 ;

Vì các chân trong liên minh được đảm bảo tách rời nên UNION ALLcó thể sử dụng và đó có thể là một lợi thế về hiệu suất so với chỉ sử dụng a UNION.

Tôi tin rằng SQL-server 2008 hỗ trợ các hàm cửa sổ như row_number (), vì vậy bạn có thể sử dụng một cái gì đó như:

SELECT employee_id, employee_ident, utc_dt, rx_dt
FROM (
    SELECT employee_id, employee_ident, utc_dt, rx_dt
      , row_number() over (partition by substring(employee_id,1,4)
                           order by rx_dt desc) as rn 
    FROM employee
    JOIN employee_mdata_history 
        ON employee.ident = employee_mdata_history.employee_ident 
    WHERE employee_id like 'emp1%' 
       OR employee_id like 'emp3%'
) as T 
WHERE rn = 1 
ORDER BY rx_dt desc;

-2

Bạn đang sử dụng TOP(1)order bymệnh đề. Vì vậy, bạn sẽ chỉ nhận được bản ghi hàng đầu đầu tiên theo thứ tự.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.